Android11 AOSP给EmbeddedKitchenSinkApp加JNI代码遇链接错误求助
解决Android 11 AOSP中EmbeddedKitchenSinkApp JNI库找不到的链接错误
问题根源
你的问题出在两个核心配置上:
- JNI库的
LOCAL_PRODUCT_MODULE := true属性,导致库被编译到/product分区,但系统应用(priv-app)默认会从/system分区加载JNI库,路径不匹配 - 编译顺序可能存在依赖问题,导致JNI库未被正确生成到指定路径
具体修复步骤
1. 修改JNI目录下的Android.mk
移除LOCAL_PRODUCT_MODULE := true配置,因为EmbeddedKitchenSinkApp是系统级priv-app,对应的JNI库需要归属系统模块而非product模块:
LOCAL_PATH:= $(call my-dir) # MyLib include $(CLEAR_VARS) LOCAL_CPP_EXTENSION := .cpp LOCAL_SDK_VERSION := 17 LOCAL_MODULE := libjni_mylib LOCAL_SRC_FILES := MyJniClient.cpp MyCode.cpp LOCAL_CFLAGS += -ffast-math -O3 -funroll-loops LOCAL_CFLAGS += -Wall -Wextra -Werror LOCAL_ARM_MODE := arm include $(BUILD_SHARED_LIBRARY)
2. 调整主应用Android.mk的编译顺序
将子目录编译指令移到include $(BUILD_PACKAGE)之前,确保JNI库先于应用编译,避免依赖缺失:
LOCAL_JNI_SHARED_LIBRARIES := libjni_mylib include $(call all-makefiles-under, $(LOCAL_PATH)) include $(BUILD_PACKAGE)
3. 重新编译验证
- 清理旧编译产物:
make clean - 单独编译目标模块:
make EmbeddedKitchenSinkApp libjni_mylib - 刷入镜像或重启模拟器后,检查:
/system/lib64/libjni_mylib.so(x86_64架构)是否存在- 应用目录下的符号链接是否指向该实际存在的文件
补充说明
Android 11中,系统应用的JNI库默认会被部署到/system/lib[64]对应架构目录,或打包进APK的lib目录。使用LOCAL_PRODUCT_MODULE := true会强制将库放到/product分区,而系统应用加载JNI时默认查找/system路径,这就导致了符号链接指向的目标文件不存在的问题。同时调整编译顺序,能确保应用编译时JNI库已生成完毕,避免链接阶段的隐性错误。
内容的提问来源于stack exchange,提问作者Anthony Sabbagh
相关产品推荐
相关产品推荐

