Android 预编译 APK 集成 JNI 库
摘要许多厂商 APK 并不是单纯的 Java/Dex 文件而是同时携带大量 JNI 动态库。EShareServer APK 内包含多个armeabi/*.so集成时需要处理 APK 内部库目录、目标 ABI、32/64 位配置以及构建系统对 APK 的重新处理。本文解释LOCAL_PREBUILT_JNI_LIBS和LOCAL_MULTILIB : 32的作用并分析zip I/O error: Permission denied的真实原因。1. APK 内部的 JNI 目录一个包含原生库的 APK通常具有类似结构EShareServer.apk ├── AndroidManifest.xml ├── classes.dex └── lib/ └── armeabi/ ├── libeshareplayer.so ├── libeshareloader.so └── ...这些.so不是系统公共库而是随 APK 一起交付由应用运行时加载。项目中的模块配置为LOCAL_PREBUILT_JNI_LIBS : \ lib/armeabi/*.so LOCAL_MULTILIB : 32其中lib/armeabi/*.so表示使用 APK 内lib/armeabi目录中的原生库LOCAL_MULTILIB : 32表示该 APK 按 32 位目标处理。2. 为什么需要声明LOCAL_MULTILIB如果目标系统是 32 位而 APK 中只有armeabi库通常需要明确告诉构建系统使用 32 位配置。否则可能出现构建系统按 64 位处理模块ABI 检查不通过APK 安装成功但启动时找不到库出现UnsatisfiedLinkErrorJNI 库依赖的其他库位数不一致。因此集成前应确认三件事系统支持的 ABI APK 中实际存在的 ABI APK 内所有 JNI 库的位数可以检查 APK 内容unzip -l EShareServer.apk | grep lib/检查 ELF 位数readelf -h libeshareplayer.so输出中的Class可以判断是 ELF32 还是 ELF64。3. 为什么 PRESIGNED 仍可能触发 ZIP 错误集成过程中遇到过zip I/O error: Permission denied这并不一定意味着 APK 损坏。APK 本质上是 ZIP 文件。构建系统处理预编译 APK 时可能需要读取 APK 内容提取其中的 JNI 库生成临时 APK重组 ZIP 目录写入中间产物。如果源 APK 文件是只读的或者构建目录权限不足就可能在写入阶段失败。因此PRESIGNED只表示不替换签名不表示构建流程完全不会读写 APK。处理此类问题时不要直接修改供应商原始文件。更稳妥的方式是将 APK 复制到可写的中间目录 ↓ 确认文件权限 ↓ 重新执行构建同时检查ls -l EShareServer.apk ls -ld out/soong ls -ld out/target/product/product4. JNI 集成后的验证构建后检查最终 APKunzip -l out/.../EShareServer.apk | grep lib/armeabi板端检查应用启动日志adb logcat | grep -iE linker|UnsatisfiedLinkError|dlopen|eshare重点关注library not found wrong ELF class cannot locate symbol permission denied如果出现wrong ELF class通常是 32/64 位不匹配如果出现cannot locate symbol则可能是 JNI 库依赖的其他库版本不一致。

相关新闻

记录C++ 11

记录C++ 11

类模板语法声明和实现必须写在同一文件,编译器由类模板生成类的过程叫做类模块的实例化,编译器自动用具体的数据类型替换类模板中的类型参数生成模板类的代码,由模板类实例化得到的类叫做模板类非类型参数必须是整型、枚举或者指向静态区的指…

2026/11/12 5:16:50 阅读更多 →
ClaudeSkills deep-research v8设计理念拆解:单Agent优先与thin harness fat skill深度解析

ClaudeSkills deep-research v8设计理念拆解:单Agent优先与thin harness fat skill深度解析

ClaudeSkills deep-research v8设计理念拆解:单Agent优先与thin harness fat skill深度解析 【免费下载链接】ClaudeSkills 13 curated Agent Skills for research, product decisions, decks, publishing, audits, and more — portable across skills-compatible …

2026/10/27 8:29:45 阅读更多 →
ORB_SLAM2 :MapPoint::UpdateNormalAndDepth()

ORB_SLAM2 :MapPoint::UpdateNormalAndDepth()

MapPoint::UpdateNormalAndDepth() 函数是ORB_SLAM2里MapPoint几何属性维护的核心函数。它主要做两件事:更新MapPoint的平均观测方向、更新MapPoint的合理观测距离范围。最终更新三个非常重要的核心成员。mNormalVector // 平均观测方向 mfMaxDistance // 最大有…

2026/11/9 4:45:17 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/14 5:13:29 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/14 5:13:29 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/14 5:13:29 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/14 2:41:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/14 5:13:29 阅读更多 →

日新闻

周新闻

月新闻