NDK r10 b 32位或64位或同时使用两者编译以及如何实现

Sha*_*ajo 3 android openvpn android-ndk android-studio ndk-build

当我使用R10B 64位生成器编译项目时,它编译良好,没有任何问题

我能够在Lollipop中成功运行该项目,并且应用程序按预期运行

但是,当我在运行时在JellyBean中运行项目时,出现以下错误

无法加载“ /data/data/de.blinkt.openvpn/cache/pievpn.armeabi-v7a”所需的库“ libopenvpn.so”;由soinfo_relocate(linker.cpp:987)引起:无法找到由“ libopenvpn.so”引用的符号“随机” ...无法链接执行

所以当我研究时,我发现其归因于使用64位构建器,而解决方案是使用32位构建器。

当我使用32个生成器时,在编译过程中会出现以下错误。

Android NDK:NDK应用程序“本地”针对未知的ABI:arm64-v8a x86_64 Android NDK:请在./jni/Application.mk
/ Users / ShajilShocker / Documents / Android / NDK / android-ndk-中修复APP_ABI定义r10b / build / core / setup-app.mk:112:*** Android NDK:正在中止。停止。

因此,如果我省略了arm64-v8a和x86_64,那么它可能会编译,但看起来无法在64位设备上运行。

是否有可能我可以先使用32位(注释64个体系结构)编译同一个项目,然后使用64位(不注释64种体系结构)编译并同时在两者上运行。

任何帮助都非常感谢!

谢谢 !

Bit*_*ank 5

运行Lollipop的64位ARM&X86设备(不确定MIPS)可以执行32或64位本机代码(ARMv7a / ARMv8和X86 / X64)。Android允许您将具有多个ABI(特定于CPU的代码)的本机代码库绑定到APK中。这些也称为“ FAT”二进制文件。例如,要构建同时包含ARMv7a和ARMv8代码的FAT二进制文件,请将以下行添加到Application.mk文件中:

APP_ABI := arm64-v8a armeabi-v7a
Run Code Online (Sandbox Code Playgroud)

然后,在Android.mk文件中,可以为每种CPU类型添加特定设置:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
<your custom ARM 32-bit build instructions here>
endif

ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
<your custom ARM 64-bit build instructions here>
endif
Run Code Online (Sandbox Code Playgroud)

当您在32位系统上运行包含32位和64位代码的胖二进制文件时,它将加载32位代码,反之亦然。不需要有条件地为每个目标设备编译代码。这就是胖二进制文件的目的-系统自动加载适合目标体系结构的库。