我正在开发一个使用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
我确定库已加载。你知道我该如何解决这个问题吗?
答案 0 :(得分:4)
我怀疑你用C ++编译器编译了本机方法,并没有给它们extern "C"
链接。您为-C
提供的nm
选项会对C ++名称进行解组,但实际上,符号的名称与JVM的名称不同,因为代码是使用C ++链接编译的。将您的C ++代码包含在extern "C"
块中,这应该可以解决问题。
答案 1 :(得分:0)
我不知道您的MainRenderer是什么以及您正在使用的本机库但我的c文件函数总是如下所示:
void Java_com_ndkfoo_NDKFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
我调用的方法/类是NDKFooActivity,它调用一个原生函数...