3

当我使用 r10b 64 位生成器ndk 编译项目时,它编译得很好,没有任何问题

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

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

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

所以当我研究我发现它是由于使用 64 构建器和解决方案是使用 32 位构建器。

当我使用 32 builder 时,在编译过程中出现以下错误。

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 架构)编译并在两者上运行。

任何帮助都非常感谢!

谢谢 !

4

2 回答 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 位代码的胖二进制文件时,它将加载 32 位代码,反之亦然。不需要为每个目标设备有条件地编译代码。这就是胖二进制文件的目的——系统自动加载适合目标架构的库。

于 2015-04-27T16:38:43.860 回答
1

根据官方文档https://developer.android.com/about/versions/android-5.0-changes.html#64BitSupport,您应该使用 NDK Revision 10c 至少支持 64 位系统。

于 2017-02-22T02:36:11.673 回答