UnsatisfiedLinkError问题

时间:2011-09-15 15:35:13

标签: java android java-native-interface runtime-error

我正在开发一个使用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

我确定库已加载。你知道我该如何解决这个问题吗?

2 个答案:

答案 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,它调用一个原生函数...