1
votes

in Java code:

System.loadLibrary("twolib-second");

int  z = add(1, 2);

public native int add(int  x, int  y);

first.cpp:

#include "first.h"

int  first(int  x, int  y) {
    return x + y; }

first.h:

#ifndef FIRST_H
#define FIRST_H

extern int first(int  x, int  y);

#endif /* FIRST_H */

second.c:

#include "first.h"
#include <jni.h>

jint
Java_com_example_jniexample_MainActivity_add( JNIEnv*  env,
                                      jobject  this,
                                      jint     x,
                                      jint     y )
{
    return first(x, y);
}

Android.mk:

LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-first
LOCAL_SRC_FILES := first.cpp

include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-second
LOCAL_SRC_FILES := second.c

LOCAL_STATIC_LIBRARIES := libtwolib-first

include $(BUILD_SHARED_LIBRARY)

I keep getting this error:

/home/username/ndk/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:./obj/local/armeabi/objs/twolib-second/second.o: in function Java_com_example_jniexample_MainActivity_add:jni/second.c:26:

error: undefined reference to 'first' collect2: ld returned 1 exit status make: * [obj/local/armeabi/libtwolib-second.so] Error 1

1
first() should have its prototype declared inside an extern "C" {} block to avoid name mangling if you want it to be callable from C. But you may have other issues with the build/link as well.Chris Stratton
maybe "how to call c++ function from c" will make a better title for this question.jin

1 Answers

2
votes

you need to use extern "C" to surround the declaration in first.h in order to call func first from second.c.

I guess this is because your first file is compiled as cpp but second as c. the difference is the name mangling. you can call linux bin util command nm to the static lib and object file to list up symbols and see wjere the rob is. i think you will see in the static lib there is a mangled symbol of funcion first; a unmangled symbol of func in the second.o

you will see many many undefined references while programming with ndk. linux bin utils will be nice tool to make life easier.