Android无法链接* .so lib

问题描述:

我是Android新手,需要我用C++创建一个具有函数的应用程序,他们给了* .so文件。Android无法链接* .so lib

我把* .so文件的下一个目录:

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

Ÿ负荷就以这样的方式

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/Process:发送信号。 PID:5364 SIG:9 应用程序已终止。

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

+1

1).apk文件是压缩文件,重命名您的apk文件并解压缩它以查看.so文件是否将其加载到apk文件中。 2)请显示具有'smartcardInit(...)'的.h和.c/C++文件。 3)Java loadLibrary不加载相关的.so文件,你需要加载最依赖的.so文件1st,然后加载下一个最依赖的.so文件等。 –

+0

我已经完成了这一步,并且我已经在lib文件夹中看到了库,我还可以做些什么? – mareyes

+0

那么,你有没有做到这一点? –

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

当本地方法签名不匹配时,通常由于本地库假定的包名称与Java应用程序中使用的包名称不同,所以类似于您看到的那些类似于预构建库的错误。

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

可以使用nm命令,它分布与NDK,分析的的导出函数的实际名称。所以,和预期的Java包可以从导出。