Android无法链接* .so lib

时间:2016-11-13 20:41:03

标签: java android c++ java-native-interface linker-errors

我是Android的新手,要求我用C ++创建一个带有函数的应用程序,他们给出了* .so文件。

我将* .so文件放在下一个目录中:

src
│       ├── main
│       │   ├── java
│       │   ├── jniLibs
│       │   │   ├── armeabi
│       │   │   │   ├── libjni_lib1.so
│       │   │   │   ├── libjni_lib2.so
│       │   │   │   ├── libjni_libn.so

Y以这种方式加载它:

static {
   System.loadLibrary("jni_lib1");
}

但是当我调试应用程序时,会出现以下错误:

java.lang.UnsatisfiedLinkError: Native method not found: com.cloudpos.jniinterface.SmartCardInterface.smartcardInit:()I
                  at com.cloudpos.jniinterface.SmartCardInterface.smartcardInit(Native Method)
                  at cr.pf.com.controller.SmartCardController.searchBegin(SmartCardController.java:57)
                  at cr.pf.com.cr.MainActivity.onClick(MainActivity.java:134)
                  at android.view.View.performClick(View.java:4438)
                  at android.view.View$PerformClick.run(View.java:18439)
                  at android.os.Handler.handleCallback(Handler.java:733)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:136)
                  at android.app.ActivityThread.main(ActivityThread.java:5111)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:780)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:596)
                  at dalvik.system.NativeStart.main(Native Method)

I /处理:发送信号。 PID:5364 SIG:9 申请终止。

我已经阅读了如何添加* .so文件,并且只说将所有文件放在jniLibs文件夹中,我该怎么办?

1 个答案:

答案 0 :(得分:0)

如果loadLibrary()没有抛出异常,那么很可能正确安装了你的so文件。我仍然会在loadLibrary()之后添加日志文件 - 只是为了确保这个静态构造函数在预期时被执行。

通常,当本机方法签名不匹配时,类似于您所看到的错误会发生在预构建的库中,这通常是因为本机库假定的包名称与Java应用程序中使用的不同。

这可能是因为Android鼓励我们使用与清单中指定的应用程序包名称相同的Java包。但您可以自由地为任何类使用任何Java包名称。

您可以使用与NDK一起分发的nm命令来分析 .so 的导出函数的实际名称,并且可以从中派生出预期的Java包。