Android无法加载' .so.1'文件

时间:2014-11-24 22:04:54

标签: android android-ndk java-native-interface dalvik native-code

您好我正在使用Android原生应用程序。

有'abc.so'文件依赖于某些'xyz.so.1'文件。在构建之前,所有必需的文件都在项目结构中可用,但'。so.1'不是生成的.apk文件的一部分(我通过解包检查了apk文件)。

在尝试运行应用程序时,这导致“'java.lang.UnsatisfiedLinkError'无法从加载程序dalvik加载'abc.so.1'。

我不想推送.so.1文件,因为手机没有root,并且在生产版本上运行。如何将.so.1文件作为APK的一部分包含在内?

谢谢。

1 个答案:

答案 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