Android NDK和CPU架构

时间:2014-02-14 12:44:04

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

我刚刚开始使用Android NDK,我发现大多数使用Android NDK的开源应用都有针对多种CPU架构编译的C ++库。这真的有必要吗?如果是这样意味着生成的apk将包含多次编译的C ++库,那么apk将变得非常大?如果有人试图在没有编译库的CPU架构上运行它,应用程序会发生什么?另外,关于如何为Android构建C ++库的好教程将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

NDK软件包包含您为Android构建本机代码所需的所有文档(在docs文件夹中)。

答案 1 :(得分: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"

请注意,技术上没有理由更改 armeabi mips 变体的versionCode,但保持 armeabi&lt; armeabi-v7a&lt; 86