[英]How to call c++ methods from JNI
在Java代码中:
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)
我不断收到此错误:
/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:在函数Java_com_example_jniexample_MainActivity_add:jni / second.c:26中:
错误:对“ first” collect2的未定义引用:ld返回1退出状态make: * [obj / local / armeabi / libtwolib-second.so]错误1
您需要使用extern“ C”包围first.h中的声明,以便从second.c首先调用func。
我猜这是因为您的第一个文件被编译为cpp,而第二个文件被编译为c。 区别在于名称改写。 您可以调用linux bin util命令nm到静态库和目标文件中,以列出符号并查看抢劫情况。 我想您会首先在静态库中看到一个功能混乱的符号; 第二个中的func完整符号
使用ndk编程时,您会看到许多未定义的引用。 linux bin utils将是使生活更轻松的好工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.