在Android NDK中使用更高的API而不是Android Manifest中的最低值是否有效?

时间:2017-04-19 20:59:17

标签: android c++ android-ndk clang

我有一个Android应用,指定最低API级别为15,目标API为17.通常,我指定android-15<ndk>/platforms/android-15)作为我的API级别(通过--sysroot )对于使用Android NDK的我的应用程序的本机部分,因为AFAIK的最小值应该通过NDK定位。

但是,在NDK r14中似乎存在Clang + LLVM STL的错误,除非您使用strtold最小,否则android-21之类的符号无法正确定义在NDK方面。

所以我的问题是:使用针对*.so编译的android-21对于针对min SDK为15且目标SDK为17的APK的影响是什么?我可以逃脱这个吗?

2 个答案:

答案 0 :(得分:1)

简答:不。请参阅我们的Common Problems doc

  

NDK中的目标API级别与Java中的targetSdkVersion具有非常不同的含义。 NDK目标API级别是您应用的最低支持的API级别。在ndk-build中,这是您的APP_PLATFORM设置。

     

由于在加载库时(而不是在第一次调用它们时)(通常)解析对函数的引用,因此您不能引用并不总是存在的API并使用API​​级别检查来保护它们的使用。如果他们被提及,他们必须在场。

更长,更迂腐的答案:只有在特殊情况下,它才真正更高。例如,NDK中没有android-20。在这种情况下,你会回到android-19,所以可以将NDK目标API设置为android-20,其中minSdkVersion为19,因为你实际上已经结束了反正使用android-19。

答案 1 :(得分:0)

如果我记得正确指定ndk中的最小值将包括头文件和链接与该版本的android一起提供的库。 理论上,只要1.)旧的版本中存在库,并且2.)库与旧版本的ABI兼容。这意味着类定义或二进制中符号的存在,缺失或位置没有重大变化,通常linux在保持ABI兼容性方面相当不错,但它不是防弹的,而且对于android,google似乎在它们何时添加和删除内容感觉它几乎没有理由。当他们在旧版本中破坏或保留ABI兼容性时,他们肯定不会做广告。

我认为现代版本的android也会在loadlibrary代码中警告你,如果你尝试加载链接到较新平台的库。哪个看起来不太好。(我一定想到这个)

所有这一切都表示你可能不应该这样做。 在你的情况下,我可能会建议不使用LLVM STL(或静态链接),因为这是未定义符号的来源,LLVM STL没有在平台21之前的设备上发布,因此你无法链接它并定位这些设备。