在 Android NDK 中使用比 Android 清单中最低 API 更高的 API 是否有效?
Is it valid to use a higher API in the Android NDK than the minimum in Android Manifest?
我有一个Android应用程序,它指定最低API级别为15,目标API为17。通常,我指定android-15
(<ndk>/platforms/android-15
)作为我的API级别(通过--sysroot
)作为我的应用程序的原生部分使用Android NDK,因为AFAIK的最低目标应该是通过NDK。
但是,NDK r14 中的 Clang + LLVM STL 似乎存在一个错误,除非您在 NDK 端使用最少的android-21
,否则无法正确定义strtold
等符号。
所以我的问题是:使用为android-21
编译的*.so
,其APK目标最小SDK为15,目标SDK为17,会产生什么影响?我能侥幸逃脱吗?
简短回答:否。请参阅我们的常见问题文档。
NDK 中的目标 API 级别与 Java 中的目标 API 级别具有非常不同的含义
targetSdkVersion
。NDK 目标 API 级别是您应用支持的最低API 级别。在ndk-build
中,这是您的APP_PLATFORM
设置。由于对函数的引用(通常)是在加载库时而不是在首次调用库时解析的,因此不能引用并不总是存在的 API,也不能通过 API 级别检查来保护它们的使用。如果提到它们,它们必须存在。
更长,更迂腐的答案:仅在它不是真的高的特殊情况下。例如,NDK 中没有 android-20。在这种情况下,您将回退到 android-19,因此可以将 NDK 目标 API 设置为 android-20,minSdkVersion
为 19,因为您实际上最终都会使用 android-19。
如果我没记错的话,在 ndk 中指定一个最小值将包括针对该版本的 android 附带的库的标头和链接。 从理论上讲,只要 1.)库存在于旧版本和 2.)这些库与旧版本兼容。这意味着在二进制文件中类定义或符号的存在、缺失或位置方面没有重大变化,通常 linux 非常擅长保持 ABI 兼容性,但它不是防弹的,对于 android,谷歌似乎在他们喜欢的时候添加和删除东西几乎没有任何理由。当他们破坏或保留旧版本中的 ABI 兼容性时,他们当然不会做广告。
我认为现代版本的 android 也会在加载库代码中警告您,如果您尝试加载链接到较新平台的库。这看起来不太好。(我一定是想象到的)
所有这些都意味着你可能不应该这样做。在您的情况下,我可能会建议不要使用 LLVM STL(或静态链接它),因为这是未定义符号的来源,LLVM STL 在平台 21 之前没有在设备上发布,因此您无法链接到它并针对这些设备。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 如何使用 ndk 加载 Android 版 AAudio API
- E/libEGL:调用没有当前上下文的 OpenGL ES API (每个线程记录一次) - Android/SDL
- 在Android Studio项目中使用tensorflow lite C++API的问题
- 是否可以在SO库中公开C API以访问Android JAVA方法
- 直接在Android NDK端使用tensorflow(不使用JAVA api)
- 在 Android NDK 中使用比 Android 清单中最低 API 更高的 API 是否有效?
- Android Camera2 API-实时显示处理的框架
- MT4 API on Android
- QNetworkReply https API 在 Android 设备上不起作用 - QT
- Android NDK调用共享库中静态库的API
- 编译android中特定api级别的c++
- 适用于Android NDK的NFC API
- Android:调用未实现的OpenGL ES API在glMapBufferOES为OGL ES.1.1
- 是否有任何api允许你在c/c++中调用部分Android SDK ?
- 在Android上使用Cocos2d-x api打开文件
- Android NDK,JNI,蓝牙:使用JNI设计Android应用程序,该应用程序具有带有蓝牙api /方法的c++
- 是否有任何Api在android为ms office word(.doc/.docx)到(图像/html/xml/pdf