【问题标题】:UnsatisfiedLinkError: Native method not found with .so file correctly put in Eclipse libsUnsatisfiedLinkError:未找到本机方法,将 .so 文件正确放入 Eclipse 库中
【发布时间】:2016-01-20 08:31:59
【问题描述】:

我是使用 Android 原生方法的新手。即使我已确保将带有正确 *.so 文件的 armeabi、armeabi-v7a、mips 和 x86 正确放入文件夹中,但仍出现以下错误。

10-21 18:51:36.685: E/AndroidRuntime(24277): java.lang.UnsatisfiedLinkError: Native method not found: com.arzap.mimas.MimasJNI.MIMAS_LoadModel:(Ljava/lang/String;)V
10-21 18:51:36.685: E/AndroidRuntime(24277):    at com.arzap.mimas.MimasJNI.MIMAS_LoadModel(Native Method)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at com.arzap.mimas.ar.MainActivity.onCreate(MainActivity.java:36)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.app.Activity.performCreate(Activity.java:5451)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.app.ActivityThread.access$900(ActivityThread.java:175)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.os.Handler.dispatchMessage(Handler.java:102)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.os.Looper.loop(Looper.java:146)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at android.app.ActivityThread.main(ActivityThread.java:5602)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at java.lang.reflect.Method.invokeNative(Native Method)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at java.lang.reflect.Method.invoke(Method.java:515)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
10-21 18:51:36.685: E/AndroidRuntime(24277):    at dalvik.system.NativeStart.main(Native Method)

如下是我加载 .so 文件的方式:

static{
    try {
        System.loadLibrary("libMimasAr3D");
    } catch (UnsatisfiedLinkError use) {
        Log.e("JNI", "WARNING: Could not load libMimasAr3D.so");
    }
}

额外的东西(我认为这不是主要问题)?

在我加载库的同一个文件中,我有这个方法:

public static native void MIMAS_LoadModel(int ppModel);

主Activity.java:

   //Description: Load the model.
   //Input: pModelPath - A file path to the saved model.
   //Return: A pointer to the object of the model. NULL if loading is failed.
    //Load image to MIMAS_SDK
    MimasJNI.MIMAS_LoadModel("models/model.bin");

请帮我解决这个问题。提前致谢!

【问题讨论】:

  • 尝试放入jni文件夹
  • 谢谢。我已经将我的库放入 jni 文件夹中,但仍然无法正常工作。
  • 你能把你的项目结构,截图贴出来吗?

标签: android opencv java-native-interface shared-libraries native


【解决方案1】:
  1. loadLibrary() 采用不带 "lib" 前缀的名称。

  2. 如果你不使用RegisterNatives(),你应该按照javah的规定命名你的原生库的导出函数,例如Java_com_arzap_mimas_MimasJNI_MIMAS_1LoadModel.

  3. 如果本机代码是 C++,请确保导出的函数具有 extern "C" 前缀以防止名称修改。

【讨论】:

  • 很遗憾,我不明白你的问题。 Q 中的消息显示本机库已加载(与referenced Q 中的问题不同)。实际上,您应该在 logcat 中看到有关已加载库的明确行。如果您使用的是第 3 方共享库,并为其编写了 Java 层,请注意您的 Java 类和包应与共享库中的名称完全匹配。
  • 您在 NDK 中有一个名为 nm 的工具。请运行nm -D <path>/libMimasAr3D.so,看看那里的本地方法究竟是如何命名的。
  • 它和libMimasAr3D.so完全一样,我什至尝试在*.so中放入依赖项(也没有效果)。这就是我在这里寻求专家并获得帮助的原因。
  • 那么,nm -D的答案是什么?
  • 千行可以,你能在其中找到你的native方法吗?
猜你喜欢
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多