【问题标题】:NDK r10 b 32 bit or 64 bit or compile using both and how to achieve itNDK r10 b 32 位或 64 位或使用两者编译以及如何实现
【发布时间】:2015-07-05 04:03:39
【问题描述】:

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

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

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

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

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

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

Android NDK:NDK 应用程序“本地”针对未知 ABI:arm64-v8a x86_64 Android NDK:请修复 APP_ABI 定义 ./jni/Application.mk
/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 架构)编译并在两者上运行。

非常感谢任何帮助!

谢谢!

【问题讨论】:

  • 这已经在您链接的问题中得到解决,但是那里的提问者没有选择最佳答案 - 请参阅 Michaël 的回答,指出目标 Android 版本的重要性。

标签: android android-studio android-ndk openvpn ndk-build


【解决方案1】:

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

【讨论】:

  • 那么,您是否建议我使用 32 位 NDK 构建器并进行更改?
  • @Shajo 您需要决定如何构建它并对 Application.mk 和 Android.mk 进行更改。您的问题意味着您不清楚它是如何工作的。您可以选择将哪些 ABI 包含在您的应用程序中,并且将为每个 ABI 构建单独的对象库。 ANT 工具会将它们全部绑定到一个 APK 中。
  • 我正在考虑从 application.mk APP_ABI := arm64-v8a armeabi armeabi-v7a mips x86 x86_64 中省略 arm64-v8ax86_64
  • 我只是希望应用在 64 位设备上也不会失败
  • 如果您不想专门针对 64 位进行优化,而只是为 ARMv7a 和 x86 构建,它可以在 32 位和 64 位设备上运行,因此应该可以满足您的需求。如果 32 位二进制文​​件不能在 64 位设备上运行,那么最近购买 Galaxy S6 或 HTC M9 的每个人都会非常沮丧。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2011-04-12
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多