【问题标题】:Android Unable to load '.so.1' fileAndroid 无法加载“.so.1”文件
【发布时间】:2014-11-24 22:04:54
【问题描述】:

您好,我正在开发一个 Android 原生应用程序。

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

这导致在尝试运行应用程序时出现“'java.lang.UnsatisfiedLinkError' Couldnt load 'abc.so.1' from loader dalvik”。

我不想推送 .so.1 文件,因为手机没有植根并且在生产版本上运行。如何将 .so.1 文件包含在 APK 中?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我想你还没有通过 JNI 将原生库加载到 Java 的概念。

    首先,您在 java 中定义本地方法并在本地执行相应的实现并编译它(您必须按照命名约定注册本地方法 1) 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 库 System.loadLibrary(next_dependent_lib1.so); //可以依赖android库和independent_lib.so System.loadLibrary(next_dependent_lib2.so); //可以依赖android libs,independent_lib.so,next_dependent_lib1.so ...... …… ..

    }

    如果你搞砸了,VM 将无法链接库并抛出 unsatisfied link 错误。

    最后,所有这些 .so 将成为您的 apk 的一部分,并将被推送到系统库仅运行时。除非它是有根手机,否则您无法提取 .so。如果您遵循上述方法,则无需将任何 .so 推送到系统。仅在 eclipse/cygwin 上构建并运行

    希望这会有所帮助,

    问候, 虾肉

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      相关资源
      最近更新 更多