我有一个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的影响是什么?我可以逃脱这个吗?
答案 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之前的设备上发布,因此你无法链接它并定位这些设备。