You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android11 AOSP给EmbeddedKitchenSinkApp加JNI代码遇链接错误求助

解决Android 11 AOSP中EmbeddedKitchenSinkApp JNI库找不到的链接错误

问题根源

你的问题出在两个核心配置上:

  1. JNI库的LOCAL_PRODUCT_MODULE := true属性,导致库被编译到/product分区,但系统应用(priv-app)默认会从/system分区加载JNI库,路径不匹配
  2. 编译顺序可能存在依赖问题,导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:29:59