我有一个包含本机二进制文件的应用程序。目前,我们只有ARMv5和x86二进制文件。有了这些,我们把二进制文件放到src/main/jniLibs/armeabi/libsyncthing.so和src/main/jniLibs/x86/libsyncthing.so中,它在所有设备上都能很好地工作。
现在我们想要添加一个额外的ARMv8二进制文件,放在src/main/jniLibs/arm64-v8a/libsyncthing.so中。根据this guide的说法,这是正确的子文件夹。然而,当我在LG G4 (支持ARMv8)上安装apk时,/lib/文件夹中没有安装二进制文件,应用程序无法运行。
我在这里做错了什么?
在这里,您可以看到二进制文件都包含在apk中:

您可以在this PR on Github中查看完整的代码。这里没有包含二进制文件,但可以使用./gradlew buildNative生成。
发布于 2017-01-05 11:30:18
我终于自己想明白了。问题是我在做
binary = context.getApplicationInfo().dataDir + "/lib/libsyncthing.so";
事实证明,ARMv8库存储在不同的位置,因此此操作失败。取而代之的是,我不得不使用以下代码:
binary = context.getApplicationInfo().nativeLibraryDir + "/libsyncthing.so";
发布于 2016-09-14 21:52:02
您是使用System.LoadLibrary还是其他方式来加载库?
从Android6.0开始,如果.so文件以未压缩的方式存储,并且apk是.so对齐的(都是默认的as2.2),.so文件可以就地使用,从APK加载,而不是从其他地方解压。
您可以尝试设置:
<application
android:extractNativeLibs="true"
...
>来修改此行为。
https://stackoverflow.com/questions/39478884
复制相似问题