【问题标题】:Android NDK and CPU architecturesAndroid NDK 和 CPU 架构
【发布时间】:2014-03-13 20:08:01
【问题描述】:

我刚刚开始使用 Android NDK,我看到大多数使用 Android NDK 的开源应用程序都为多个 CPU 架构编译了 C++ 库。这真的有必要吗?如果是,这是否意味着生成的 apk 将包含多次编译的 C++ 库,因此 apk 会变得非常大?如果有人试图在没有编译库的 CPU 架构上运行该应用程序会发生什么?也非常感谢您提供有关如何为 android 构建 C++ 库的好教程。

【问题讨论】:

  • 如果您打算公开您的应用程序,那么您不知道您的用户将在什么架构上运行,因此如果您想要最大的兼容性,这是必要的。请参阅 NDK 中的 docs/CPU-ARCH-ABIS.htmlthis
  • 如果没有针对设备架构的编译库,则无法从 Google Play 安装 APK。 Play 将所有本机库视为应用程序功能所必需的。如果还是手动安装,System.loadLibrary() 会抛出异常。根据应用程序的 Java 部分,它可能会强制关闭、正常关闭或以减少的功能运行。
  • 一个警告:许多设备支持两种架构。所有 armeabi-v7a 设备都支持 armeabi 作为后备。一些 x86 设备通过模拟器(“libhoudini”)支持 armeabi。

标签: android c++ android-ndk cpu-architecture


【解决方案1】:

没有必要将它们全部放置,但如果不放置,则排除此架构的设备。 apk 将包含所有二进制文件,安装程序将在安装时选择正确的二进制文件,因此不会发生针对另一个应用程序运行二进制文件的情况(除非我们正在考虑越狱设备)。

NDK 包包含构建 Android 原生代码所需的所有文档(在 docs 文件夹中)。

【讨论】:

    【解决方案2】:

    您可以为不同的处理器架构构建单独的 APK 文件,Play Store 完全支持这一点。您的客户将只获得他们真正需要的东西,而不是下载一个“胖”APK,请参阅Android Build Separate Apks for Different Processor Architectures

    要使用 ant 执行此类构建,您可以使用以下脚本:

    <target name="-pre-build">
        <exec executable="${ndk.dir}/ndk-build" failonerror="true"/>
        <arg value="APP_ABI=${abi}"/>
    </target>
    

    并使用批处理文件运行循环(我使用简单的sed 脚本;sed 在%NDK_ROOT%\prebuilt\windows\bin\ 和所有其他平台上都可用):

    sed -i -e "s/versionCode=\"\([0-9]*\).]\"/versionCode=\"\11\"/" AndroidManifest.xml 
    ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=armeabi release
    ren %apkfile%.apk %apkfile%_armeabi.apk
    
    sed -i -e "s/versionCode=\"\([0-9]*\).\"/versionCode=\"\12\"/" AndroidManifest.xml 
    ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=mips release
    ren %apkfile%.apk %apkfile%_mips.apk
    
    sed -i -e "s/versionCode=\"\([0-9]*\).\"/versionCode=\"\13\"/" AndroidManifest.xml 
    ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=armeabi-v7a release
    ren %apkfile%.apk %apkfile%_armeabi-v7a.apk
    
    sed -i -e "s/versionCode=\"\([0-9]*\).\"/versionCode=\"\14\"/" AndroidManifest.xml 
    ant -Dsdk.dir=%SDK_ROOT% -Dndk.dir=%NDK_ROOT% -Dabi=x86 release
    ren %apkfile%.apk %apkfile%_x86.apk
    

    这假设清单文件中的 android.verisonCode 的最后一位数字为零,例如android:versionCode="40260".

    请注意,技术上没有理由更改 armeabimips 变体的 versionCode,但保持 armeabi 。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 2021-12-01
      • 2012-06-10
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多