简体   繁体   中英

How to call c++ methods from JNI

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM