这篇文章通过实战案例,介绍了一种有条理的组织Native层代码层级结构的方法。并且,在良好的代码层级、作用分工的基础上,实现了动态的按需加载、卸载so库。文章的最后,还介绍了实践过程中遇到的困难以及对应的解决方案,能让读者少走弯路。 — 责任编辑 wingyipye

1. 为什么在Native层动态加载so库

随着Android App发展的不断变化,App的性能和系统API框架外的功能拓展显得越来越重要。App从性能方面考虑,需要在Native层使用C/C++实现的方案,Native层再通过JNI的方式提供方案给实现应用基本功能的Java层调用,来拓展一些计算密集型的功能。例如App如果要支持播放手机自身不支持播放的音频格式,就需要在Native层实现App自己的音频解码功能。

随着项目规模的增大,Native层的代码规模也逐渐膨胀起来。为了更清晰的组织代码,Native层之间也会按照模块分别构建成独立的so库。其中为了简化Java层与Native层之间的通信方式,通常会特地使用一个JNI层so库引用其他实现具体功能的功能实现so库。Java层只加载这个JNI层so库,来间接调用功能实现so库。

so库之间通过引用头文件和运行时指定共享库依赖的方式形成了依赖关系。但是这种简单的模块划分方式存在着一些问题:

应用上层的热修复方案需要so库能够支持被动态加载,这样出现问题的so库才能够在应用运行的时候先被替换为修复问题的库文件然后才被加载。对于Java层直接引用的so库,动态加载可以使用Java层的

android 动态库获取路径问题,一种Android App在Native层动态加载so库的方案相关推荐

  1. android 加载三方so的方法_Android开发教程之动态加载so库文件的方法

    Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...

  2. Android基础——动态加载so库

    Android中动态加载so 原因:如果把so文件直接放在libs目录下,在android程序启动的时候会默认加载libs目录下的所有so库,但这些so库可能会在某些地方存在冲突,使用动态加载so库, ...

  3. CrossWalk - Android 动态加载so库文件

    转自: https://segmentfault.com/a/1190000002919135 之前看到简书Android客户端使用的编辑器,甚是喜欢,它的优雅以及高性能的特点让我爱不释手,很想自己也 ...

  4. android 图片资源目录下,Android编程实现获取图片资源的四种方法

    本文实例讲述了Android编程实现获取图片资源的四种方法.分享给大家供大家参考,具体如下: 1. 图片放在sdcard中: Bitmap imageBitmap = BitmapFactory.de ...

  5. 动态加载so库的实现方法与问题处理

    前一阵项目上要求实现App的so库动态加载功能,因为这块本来就有成熟的方案,所以一般的实现没什么难度.可是到项目测试中,才发现有不少意料之外的情况,需要一一针对处理,故此记录一下具体的解决办法,以供后 ...

  6. Linux动态加载共享库,Linux共享库的动态加载(附测试案例)

    共享库的动态加载是指可以在程序运行的过程中去加载所需的共享库.常用于某些系统或者应用程序的自动升级. 在C语言的源程序动态加载共享库,需要调用一组特殊的函数,它们被声明于一个专门的头文件dlfcn.h ...

  7. android通过Jni加载so库遇到UnsatisfiedLinkError问题!!!

    错误信息: java.lang.UnsatisfiedLinkError: hsl.p2pipcam.nativecaller.NativeCaller at hsl.p2pipcam.manager ...

  8. Android NDK下STD库share static方式加载 (so库混乱调用问题)

    结论 -DANDROID_STL=c++_shared 有该选项 share方式加载STL,打包的so库不含有STD代码 没该选项 static方式加载STL. // 打so库的build.gradl ...

  9. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. Python 将字符串转为字典
  2. Linux下golang开发环境搭建
  3. 快速得到栈、队列的最大值
  4. 【电信增值业务学习笔记】10基于业务节点的增值业务提供技术
  5. 第十章 PX4-Pixhawk-姿态控制
  6. jOOQ,H2和Maven入门
  7. Android控制ScrollView滑动速度
  8. 在Eclipse里使用代码模板
  9. 计算机rank函数怎么用积分排名,excelrank函数积分排名
  10. 华硕h81m一k跳线图_股票入门基础知识:你真的看懂了K线图了?【建议收藏】1...
  11. golang 最小堆排序实现
  12. 商品中心 --- 淘宝类目属性体系
  13. 【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口
  14. 聚焦“芯”产业,搭建“芯”桥梁——清微智能出席AIIA2020年度AI芯片交流会
  15. Jetson设备下使用docker报错的排错过程完整记录,failed to create shim: OCI runtime create failed: container_linux.go:38
  16. Trx-address和交易的address
  17. 用计算机实现校正环节采样开关加在哪,计算机控制技术习题—广州工业大学.doc...
  18. OJ考试特别版,数组模拟链表(比正儿八经用链表简单,结果还对,何乐而不为)
  19. Water Sensor水位传感器学习笔记
  20. 【解决方法】Appium 报错 Original error: chrome not reachable

热门文章

  1. 给python点颜色青少年学编程_给老师的新年祝福语
  2. doraemon的python 池
  3. android activity pause,关于android:onPause()和onStop()在Activity中
  4. 研究生计算机论文怎么写,研究生计算机论文摘要怎么写 研究生计算机论文摘要范文参考...
  5. 教你把gps服务器修改为中国加速搜星,手机导航-GPS搜星速度优化(android手机)...
  6. 鸿门宴 项伯为什么要保护刘邦
  7. 如何修改textfield的 return 键的类型
  8. 30 行 Javascript 代码搞定智能家居系统 1
  9. Batch Momentum
  10. C++ 类型转换(static_cast、dynamic_cast、reinterpret_cast、const_cast)