未从.apk安装ARMv8库

时间:2016-09-13 20:59:01

标签: android android-ndk

我有一个包含原生二进制文件的应用。目前,我们只有ARMv5和x86二进制文件。有了这些,我们将二进制文件放入src/main/jniLibs/armeabi/libsyncthing.sosrc/main/jniLibs/x86/libsyncthing.so,这在所有设备上都可以正常工作。

我们现在想要添加一个放在src/main/jniLibs/arm64-v8a/libsyncthing.so中的附加ARMv8二进制文件。根据{{​​3}},这是正确的子文件夹。但是,当我在LG G4(支持ARMv8)上安装apk时,/lib/文件夹中没有安装任何二进制文件,并且该应用程序无法正常工作。

我在这里做错了什么?

在这里你可以看到二进制文件都包含在apk中:

this guide

您可以在apk contents中看到完整的代码。二进制文件不包含在那里,但可以使用./gradlew buildNative生成。

2 个答案:

答案 0 :(得分:4)

我终于弄明白了。问题是我在做什么

binary = context.getApplicationInfo().dataDir + "/lib/libsyncthing.so";

事实证明,ARMv8库存储在不同的位置,因此失败了。相反,我不得不使用这段代码:

binary = context.getApplicationInfo().nativeLibraryDir + "/libsyncthing.so";

答案 1 :(得分:1)

您是使用System.LoadLibrary还是其他方式加载库?

从Android 6.0开始,如果.so文件未压缩存储且apk为zipaligned(默认为AS 2.2),则.so文件可以就地使用,从APK加载而不是在其他地方提取。

您可以尝试设置:

<application
    android:extractNativeLibs="true"
    ...
>

修改此行为。