您好我正在使用Android原生应用程序。
有'abc.so'文件依赖于某些'xyz.so.1'文件。在构建之前,所有必需的文件都在项目结构中可用,但'。so.1'不是生成的.apk文件的一部分(我通过解包检查了apk文件)。
在尝试运行应用程序时,这导致“'java.lang.UnsatisfiedLinkError'无法从加载程序dalvik加载'abc.so.1'。
我不想推送.so.1文件,因为手机没有root,并且在生产版本上运行。如何将.so.1文件作为APK的一部分包含在内?
谢谢。
答案 0 :(得分:1)
我认为你没有通过JNI将本机库加载到Java的概念。
首先在java中定义本机方法并在本机中执行相应的实现并编译它(必须按照命名注册本机方法)2遵循命名约定2)在jni_onload中注册本机方法... i认为你必须这样做,如果没有检查http://www.ntu.edu.sg/home/ehchua/programming/android/android_ndk.html)
接下来,您必须在对本机进行任何调用之前加载库。这必须做一次。您可以通过定义以下内容在活动中执行以下操作:
静态{
的System.loadLibrary( “mylib.so”);
}
注意在编译库时,您将获得库名为libXYZ.so,但是在java中加载库时,应省略“lib”,只需要system.loadlibrary(XYZ.so) 如果您正在使用NDK,那么该库已经被复制到Java项目> libs> armeabi文件夹,如果不是你必须复制你的lib.so那里
现在,如果您有多个共享库,则应首先加载最少依赖的lib.so,然后加载第二个等,即
。静态{
的System.loadLibrary(independent_lib.so); //应该只依赖于android libs 的System.loadLibrary(next_dependent_lib1.so); //可以依赖于android libs和independent_lib.so 的System.loadLibrary(next_dependent_lib2.so); //可以依赖于android libs,independent_lib.so,next_dependent_lib1.so ..... .... ..
}
如果你混乱,虚拟机将无法链接库并抛出不满意的链接错误。
最后,所有这些.so将成为你的apk的一部分,它将被推送到系统libs only运行时。除非它是一个root用户手机你无法提取.so。如果您按照上述方法操作,则无需将任何.so推送到系统。仅构建在eclipse / cygwin上并运行
希望这有帮助,
此致 Shrish