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文件夹中,我该怎么办?
答
如果loadLibrary()没有抛出异常,那么你的so文件很可能是正确安装的。我仍然会在loadLibrary()
之后添加日志文件 - 只能确保这个静态构造函数是在预期时执行的。
当本地方法签名不匹配时,通常由于本地库假定的包名称与Java应用程序中使用的包名称不同,所以类似于您看到的那些类似于预构建库的错误。
这可能会发生,因为Android鼓励我们使用与应用程序包名称相同的Java包,如清单中指定的那样。但是你可以自由地为你的任何类使用任何Java包名。
可以使用nm
命令,它分布与NDK,分析的的导出函数的实际名称。所以,和预期的Java包可以从导出。
1).apk文件是压缩文件,重命名您的apk文件并解压缩它以查看.so文件是否将其加载到apk文件中。 2)请显示具有'smartcardInit(...)'的.h和.c/C++文件。 3)Java loadLibrary不加载相关的.so文件,你需要加载最依赖的.so文件1st,然后加载下一个最依赖的.so文件等。 –
我已经完成了这一步,并且我已经在lib文件夹中看到了库,我还可以做些什么? – mareyes
那么,你有没有做到这一点? –