我正在开发一个使用 JNI 的 Android 应用程序。
命令javah -jni com.company.tests.MainRenderer
给了我这个输出:
/*
* Class: com_company_tests_MainRenderer
* Method: nativeInit
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_company_tests_MainRenderer_nativeInit
(JNIEnv *, jclass);
/*
* Class: com_company_tests_MainRenderer
* Method: nativeRender
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_company_tests_MainRenderer_nativeRender
(JNIEnv *, jclass);
命令nm -Ca libRotateJNI.so
给了我这个输出:
00001c25 T Java_com_company_tests_MainRenderer_nativeInit(_JNIEnv*, _jclass*)
00001c29 T Java_com_company_tests_MainRenderer_nativeRender(_JNIEnv*, _jclass*)
这是如何定义这些函数的:
void Java_com_company_tests_MainRenderer_nativeInit( JNIEnv* env, jobject thiz )
{
// ...
}
void Java_com_company_tests_MainRenderer_nativeRender( JNIEnv* env, jobject thiz )
{
// ...
}
并使用以下消息运行它:
WARN/dalvikvm(639): No implementation found for native Lcom/company/tests/MainRenderer;.nativeInit ()V
我确定库已加载。你知道我该如何解决这个问题吗?
最佳答案
我怀疑您使用 C++ 编译器编译了 native 方法,并且没有给它们 extern "C"
链接。您向 nm
提供的 -C
选项对 C++ 名称进行了分解,但实际上,这些符号的名称与 JVM 正在查找的名称不同,因为代码是经过编译的与 C++ 链接。将您的 C++ 代码包含在 extern "C"
block 中,这应该可以解决问题。
关于java - UnsatisfiedLinkError问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7433511/