我使用android-ndk编译了我的c源代码然后我将.so文件放在我的android项目的libs文件夹中但是当我调用本机函数时,我有一个“找不到本机的实现”错误。 如果我尝试从adb shell调用此函数一切正常,所以我不明白为什么会出现这个错误。 请帮忙, 安德烈
答案 0 :(得分:15)
JNI有一个确切的命名方案,这个方案不是很明显。也许你的函数实现不符合它?
例如,如果您希望能够从JAVA代码调用名为startServer的本机函数,假设您的包名为com.example.something且您的类名为MyClass,则您的JAVA中应该有一个成员函数像这样的课:
private native void startServer();
然后你的JNI实现应该是这样的:
JNIEXPORT void Java_com_example_something_MyClass_startServer(JNIEnv *env, jobject obj) {
// Do something here...
}
否则,存在链接错误。
答案 1 :(得分:13)
你可以得到这个的另一个原因是,如果你在进行JNI函数调用时没有调用你的库:
static {
System.loadLibrary("myJNIFILE");
}
应该在实际引用JNI函数之前的某处调用。