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

NDK r10 b 32 bit or 64 bit or compile using both and how to achieve it

当我使用 r10b 64 位构建器 ndk 编译 project 时,它编译良好,没有任何问题

我能够 运行 Lollipop 中的项目和应用程序 运行 成功

但是当我 运行 JellyBean 中的项目 运行 时,我得到以下信息 错误

could not load library "libopenvpn.so" needed by "/data/data/de.blinkt.openvpn/cache/pievpn.armeabi-v7a"; caused by soinfo_relocate(linker.cpp:987): cannot locate symbol "srandom" referenced by "libopenvpn.so"...CANNOT LINK EXECUTABLE

所以当我研究时,我 found 它是由于使用 64 位生成器而解决方案是使用 32 位生成器。

当我使用 32 生成器时,我在编译过程中遇到以下错误。

Android NDK: NDK Application 'local' targets unknown ABI(s): arm64-v8a x86_64 Android NDK: Please fix the APP_ABI definition in ./jni/Application.mk
/Users/ShajilShocker/Documents/Android/NDK/android-ndk-r10b/build/core/setup-app.mk:112: *** Android NDK: Aborting . Stop.

所以如果我省略 arm64-v8a 和 x86_64 那么它可能会编译,但它似乎不会 运行 在 64 位设备上。

我是否可以先使用 32 位(注释 64 体系结构)编译同一个项目,然后使用 64 位(取消注释 64 体系结构)和 运行 进行编译。

非常感谢任何帮助!

谢谢!

64 位 ARM 和 X86 设备(不确定 MIPS)运行ning Lollipop 可以执行 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 位代码,反之亦然。不需要在每个目标设备的代码中有条件地编译。这就是 fat 二进制文件的用途 - 系统会自动加载适合目标架构的库。

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