NDK r10是32位还是64位,或者使用两者编译,如何实现?

3
当我使用r10b 64位构建器编译项目时,它可以很好地编译,没有任何问题。我能够在Lollipop中成功运行该项目,应用程序正常运行。但是,在JellyBean上运行该项目时,我在运行时遇到了以下错误:“无法加载“libopenvpn.so”库,这是“/data/data/de.blinkt.openvpn/cache/pievpn.armeabi-v7a”所需的,因为soinfo_relocate(linker.cpp:987):无法定位符号“srandom”,被“libopenvpn.so”引用……CANNOT LINK EXECUTABLE。”所以,当我进行研究时发现这是由于使用64位构建器而导致的,解决方案是使用32位构建器。但是,当我使用32位构建器时,在编译过程中出现以下错误。
Android NDK:NDK应用程序“local”的目标ABI未知:arm64-v8a x86_64 Android NDK:请在./jni/Application.mk中修复APP_ABI定义
/ Users / ShajilShocker / Documents / Android / NDK / android-ndk-r10b / build / core / setup-app.mk:112:*** Android NDK:中止。 停止。
因此,如果我省略arm64-v8a和x86_64,则可能会编译,但似乎无法在64位设备上运行。
是否有可能我可以先使用32位编译同一项目(注释掉64位架构),然后再使用64位编译(取消注释64位架构)并在两者上运行。
非常感谢任何帮助!
谢谢!

1
这个问题已经在你链接的问题中得到了解决,但是那里的提问者没有选择最佳答案 - 请查看Michaël的答案,指出目标Android版本的重要性。 - Chris Stratton
2个回答

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

然后,在您的 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

当你在32位系统上运行包含32位和64位代码的fat二进制文件时,它将加载32位代码,反之亦然。不应该有任何需要针对每个目标设备有条件地编译代码的需要。这就是fat二进制文件的目的 - 系统会自动加载适用于目标架构的库。

那么,您建议我使用32位NDK构建器并进行更改吗? - Shajo
@Shajo,你需要决定如何构建它并对Application.mk和Android.mk进行更改。你的问题暗示着你不清楚它是如何工作的。你可以选择在你的应用程序中包含哪些ABI,并为每个ABI构建单独的目标库。ANT工具将把它们全部绑定到一个单一的APK中。 - BitBank
我正在考虑从application.mk中省略arm64-v8ax86_64,即将APP_ABI := arm64-v8a armeabi armeabi-v7a mips x86 x86_64修改为其他值。 - Shajo
如果您不想专门针对64位进行优化,只需构建ARMv7a和x86版本,它将在32位和64位设备上均可运行,这应该能满足您的需求。如果32位二进制文件无法在64位设备上运行,那么最近购买Galaxy S6或HTC M9的所有人都会感到非常沮丧。 - BitBank
Lollipop 可以支持 64 位 NDK 应用程序,但不要求 NDK 应用程序具有 64 位代码(尚未)。 - BitBank
显示剩余3条评论

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接