java - UnsatisfiedLinkError问题

标签 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

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

最佳答案

我怀疑您使用 C++ 编译器编译了 native 方法,并且没有给它们 extern "C" 链接。您向 nm 提供的 -C 选项对 C++ 名称进行了分解,但实际上,这些符号的名称与 JVM 正在查找的名称不同,因为代码是经过编译的与 C++ 链接。将您的 C++ 代码包含在 extern "C" block 中,这应该可以解决问题。

关于java - UnsatisfiedLinkError问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7433511/

相关文章:

java - 通过 Post 将 JSON 从 Java 发送到 PHP

java - 按顺序从 Java 属性文件中提取值?

android - sqlcipher 'open' 性能与 cordova 和 Cordova-SQLitePlugin

java - 在 Linux 上的 Eclipse RCP 应用程序中加载 native 库

java - 如何将 JSON 解析为 JTree,反之亦然

java - 在 Java 中重置单选按钮

android - Activity 布局继承

android - Android 相机变焦数字在数学上代表什么?

java - 无法构建项目,出现错误 - 体系结构 x86_64 的 undefined symbol : "_JNI_CreateJavaVM"

android - 使用 Android 原生 Binder 发送自定义对象