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

时间:2015-04-26 20:41:26

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

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

我能够成功地在Lollipop中运行该项目并且应用程序按原样运行

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

  

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

所以当我研究I 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个体系结构)进行编译并在两者上运行。

非常感谢任何帮助!

谢谢!

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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