Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8

使用Eclipse直接编译NDK时,可能因NDK指定版本与minSdkVersion不一致,出现编译报错。解决办法是在工程的Application.mk文件中添加代码“APP_PLATFORM := android-8”,其中8可根据实际minSdkVersion替换。

在使用Eclipse 直接编译NDK,有时候会报类似以下错误

Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8

 

这是因为NDK指定的版本与minSdkVersion不一致的问题,这本身只是一个警告,但是在eclipse下就会编译报错,那么如何修复呢?

 

只需要在你的工程的:

Application.mk

文件中添加如下代码即可:

 

[cpp] view plain copy

  1. APP_PLATFORM := android-8  

 

其中8就是指的minSdkVersion,根据自己的实际情况进行替换。

 

 

转载自:http://blog.youkuaiyun.com/jiujie_/article/details/8744017

Android NDK: android-16 is unsupported. Using minimum supported version android-21. Android NDK: WARNING: APP_PLATFORM android-21 is higher than android:minSdkVersion 1 in /Users/zhuqingbin/Downloads/Android-TiffBitmapFactory-master/tiffbitmapfactory/src/main/AndroidManifest.xml. NDK binaries will *not* be compatible with devices older than android-21. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information. Android NDK: WARNING:/Users/zhuqingbin/Downloads/Android-TiffBitmapFactory-master/tiffbitmapfactory/src/main/jni/Android.mk:tiff: non-system libraries in linker flags: /Users/zhuqingbin/Downloads/Android-TiffBitmapFactory-master/tiffbitmapfactory/src/main/jni/libs/arm64-v8a/libjpeg.a Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the Android NDK: current module Android NDK: WARNING:/Users/zhuqingbin/Downloads/Android-TiffBitmapFactory-master/tiffbitmapfactory/src/main/jni/Android.mk:tiff: non-system libraries in linker flags: /Users/zhuqingbin/Downloads/Android-TiffBitmapFactory-master/tiffbitmapfactory/src/main/jni/libs/armeabi-v7a/libjpeg.a Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the Android NDK: current module make: Nothing to be done for 'Android.mk'.
最新发布
10-16
<think>我们正在解决使用 `ndk-build` 编译 `Android.mk` 时出现的三个警告: 1. 'android-16 is unsupported. Using minimum supported version android-21' 2. 'APP_PLATFORM android-21 is higher than android:minSdkVersion 1' 3. 'non-system libraries in linker flags' 根据引用[1]:NDK构建系统会自动处理依赖关系,但我们仍需注意平台版本设置。 分析警告原因: 1. 第一个警告:NDK版本过高,已经不再支持android-16(API 16),最低支持版本提升到了android-21(API 21)。因此,即使你在`Android.mk`或`Application.mk`中设置了`APP_PLATFORM=android-16`,NDK也会自动使用最低支持的android-21。 2. 第二个警告:这是因为在`Application.mk`(或构建参数)中设置的`APP_PLATFORM`(当前为android-21)高于项目中`AndroidManifest.xml`里设置的`minSdkVersion`(目前为1)。这可能导致在低于API 21的设备上无法运行,因为编译出的库可能使用了较高版本的API。 3. 第三个警告:链接器标志中使用了非系统库。这通常是因为在`Android.mk`中通过`LOCAL_LDLIBS`或其他链接标志链接了非NDK系统自带的库,而这些库可能没有正确指定路径。 解决方案: ### 1. 解决平台版本不匹配问题 - **问题本质**:我们需要确保`APP_PLATFORM`不超过应用的`minSdkVersion`,同时也要满足NDK的最低支持版本要求(现在最低是android-21)。 根据引用[2]和[3]:将`APP_PLATFORM`设置为高于应用的`minSdkVersion`可能会导致库无法加载(因为引用了旧设备上不可用的符号)。 - **步骤**: a. **确定应用的最小SDK版本**:检查`AndroidManifest.xml`或`build.gradle`中的`minSdkVersion`属性(例如,假设应用要求最低支持到API 16)。 b. **调整`APP_PLATFORM`**:在`Application.mk`中设置`APP_PLATFORM`等于或低于`minSdkVersion`,但注意不能低于NDK支持的最低版本(现在最低是21)。这里就出现了矛盾:应用要求最低API 16,但NDK要求最低21。 实际上,从NDK r17开始,NDK不再支持API级别低于21(Android 5.0)的平台。因此,如果应用需要支持低于21的设备,我们只能: - **方法1**:降低NDK版本(比如使用NDK r16b或更早),但这些旧版本不再推荐使用。 - **方法2**:提升应用的最低SDK版本(`minSdkVersion`)到至少21。这是官方推荐的做法,因为低于21的设备市场份额已经非常低。 如果必须支持低于21的设备,则需要在代码中动态检查运行时的API级别,避免在低版本设备上调用高版本API。但这样会增加代码复杂度。 c. **设置`Application.mk`**: 如果决定将`minSdkVersion`提升到21,则可以在`Application.mk`中设置: ``` APP_PLATFORM := android-21 ``` 这样就不会出现第二个警告(因为平台版本和minSdkVersion一致了)。 如果由于某些原因不能提升`minSdkVersion`(比如必须支持旧设备),那么我们需要在`Application.mk`中设置`APP_PLATFORM`为21(因为NDK强制要求),同时确保代码中不使用任何高于`minSdkVersion`的API。这需要我们在代码中通过运行时检查来保证兼容性。 另外,根据引用[4]:使用Gradle构建时,不应该直接设置`APP_PLATFORM`,而应该在`build.gradle`中设置`minSdkVersion`。所以,如果你使用的是Gradle,可以在`build.gradle`的`defaultConfig`中设置: ```groovy defaultConfig { minSdkVersion 21 // 提升到21 // ... } ``` ### 2. 解决非系统库链接警告 警告信息:`non-system libraries in linker flags` - **原因**:在`Android.mk`中,我们使用`LOCAL_LDLIBS`来添加链接器标志。如果在这个变量中链接了非系统库(即不是NDK提供的库),比如预编译的第三方库,那么需要确保这些库的路径正确,并且使用`LOCAL_LDFLAGS`来指定库的搜索路径(使用`-L`),同时使用`LOCAL_LDLIBS`来链接具体的库(使用`-l`)。 - **解决方法**: a. 确保第三方库放置在`jni`目录下的某个子目录(例如`jni/libs`),然后通过`LOCAL_LDFLAGS`添加库搜索路径: ```makefile LOCAL_LDFLAGS := -L$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI) ``` b. 在`LOCAL_LDLIBS`中链接库时仅使用`-l`加库名(去掉前缀`lib`和后缀`.so`): ```makefile LOCAL_LDLIBS := -lmylib ``` 这样就会链接`libmylib.so`。 c. 另外,确保不要将非系统库与系统库混在一起。系统库(如`liblog`)可以直接使用`-llog`,不需要指定路径。 d. 如果你确实需要链接非NDK系统提供的库,那么请确保它们是为当前目标ABI编译的。 e. 还有一种情况:如果链接的标志中出现了绝对路径或者带有`.so`后缀的完整库文件名,也会导致该警告。应该使用`-L`和`-l`的方式。 示例`Android.mk`片段: ```makefile include $(CLEAR_VARS) LOCAL_MODULE := mymodule LOCAL_SRC_FILES := mycode.cpp # 添加第三方库的路径(假设放在jni/libs目录下,按ABI分类) LOCAL_LDFLAGS := -L$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI) # 链接系统库liblog和第三方库libmylib LOCAL_LDLIBS := -llog -lmylib include $(BUILD_SHARED_LIBRARY) ``` ### 3. 综合调整步骤 1. **升级minSdkVersion**(推荐): - 在`build.gradle`中,将`minSdkVersion`设置为至少21。 - 如果项目中有多个`productFlavors`,确保每个需要的flavor都设置了合适的`minSdkVersion`。 2. **调整`Application.mk`**: - 在`jni/Application.mk`中,设置`APP_PLATFORM`为android-21(或者与`minSdkVersion`一致): ```makefile APP_PLATFORM := android-21 ``` 3. **检查第三方库的链接**: - 确保非系统库通过`-L`和`-l`正确引入,避免在`LOCAL_LDLIBS`中直接写库文件全名或绝对路径。 4. **重新编译**: - 运行`ndk-build clean`清除旧构建 - 运行`ndk-build`重新编译 5. **运行时兼容性处理**(如果必须支持低于21的设备): - 对于所有在API 21以上才引入的函数,使用`dlopen`和`dlsym`动态加载,或者在调用前检查系统版本。 注意:根据引用[5],还要注意项目路径不要太深,避免出现路径错误。 经过以上调整,警告应该能够消除。 如果问题仍然存在,请检查NDK版本和项目配置。 --- §§相关问题§§ 1. 如何为不同的 Android ABI 编译 NDK 库? 2. NDK 开发中如何动态检查 Android 设备 API 级别? 3. NDK 项目如何正确引入预编译的第三方库? </think>针对 `ndk-build` 编译 `Android.mk` 时出现的警告问题,结合引用信息和解决方案,按优先级分步解决如下: --- ### 一、解决 `android-16 is unsupported` 警告 **根本原因**: NDK 已弃用低版本 API(如 android-16),最低支持版本提升至 android-21(API 21)[^1][^3]。 **解决方案**: 1. **升级 `APP_PLATFORM`** 在 `Application.mk` 中显式设置最低支持版本(与 NDK 兼容): ```makefile APP_PLATFORM := android-21 # 使用 NDK 支持的最低版本 ``` 2. **同步修改 Gradle 配置** 在 `build.gradle` 中同步更新 `minSdkVersion`(确保不低于 `APP_PLATFORM`)[^4]: ```groovy android { defaultConfig { minSdkVersion 21 // 与 APP_PLATFORM 一致 } } ``` --- ### 二、解决 `APP_PLATFORM is higher than minSdkVersion` 警告 **根本原因**: `APP_PLATFORM`(NDK 编译版本)高于应用声明的 `minSdkVersion`(Java 层兼容版本),可能导致低版本设备崩溃[^2][^3]。 **解决方案**: 1. **检查版本一致性** 确保以下两项版本一致: - `Application.mk` 中的 `APP_PLATFORM` - `build.gradle` 中的 `minSdkVersion` 2. **动态 API 调用(如需兼容低版本)** 若必须支持低于 API 21 的设备,需在 C/C++ 代码中动态检查 API 级别: ```c #include <android/api-level.h> if (android_get_device_api_level() >= 21) { // 使用高版本 API } else { // 低版本兼容逻辑 } ``` --- ### 三、解决 `non-system libraries in linker flags` 警告 **根本原因**: 链接器标志(`LOCAL_LDLIBS`)中引用了非 NDK 系统库(如第三方预编译库),路径或命名不规范[^5]。 **解决方案**: 1. **规范第三方库路径** 将第三方库(`.so`)置于 `jni/libs/$(TARGET_ARCH_ABI)` 目录,并在 `Android.mk` 中配置: ```makefile LOCAL_LDFLAGS += -L$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI) LOCAL_LDLIBS := -lthirdparty # 去掉前缀 lib 和后缀 .so ``` 2. **清理无效链接标志** 移除 `LOCAL_LDLIBS` 中的绝对路径或无效参数: ```makefile # 错误示例(含路径和扩展名) LOCAL_LDLIBS := /path/to/libfoo.so # 正确示例(只写库名) LOCAL_LDLIBS := -lfoo ``` 3. **验证库文件命名** 确保库文件名格式为 `lib<name>.so`(如 `libfoo.so`),链接时使用 `-lfoo`。 --- ### 四、完整配置示例 #### `Application.mk` ```makefile APP_ABI := armeabi-v7a arm64-v8a # 指定 ABI APP_PLATFORM := android-21 # 统一平台版本 ``` #### `Android.mk` ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := native-lib LOCAL_SRC_FILES := native-lib.cpp LOCAL_LDFLAGS += -L$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI) # 第三方库路径 LOCAL_LDLIBS := -llog -lthirdparty # 系统库 + 第三方库 include $(BUILD_SHARED_LIBRARY) ``` #### `build.gradle` ```groovy android { defaultConfig { minSdkVersion 21 // 与 APP_PLATFORM 一致 externalNativeBuild { ndkBuild { abiFilters 'armeabi-v7a', 'arm64-v8a' } } } } ``` --- ### 五、验证与调试 1. **清理构建**: ```bash ndk-build clean ``` 2. **重新编译**: ```bash ndk-build NDK_DEBUG=1 # 调试模式检查符号 ``` 3. **检查输出**: 确认 `libs/<ABI>/` 下生成的 `.so` 无误,无缺失符号(`nm -D libxxx.so`)。 > **提示**:若路径层级过深导致编译失败(引用[5]),建议将 JNI 目录移至项目根目录(如 `app/src/main/jni`)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值