Android引入动态库so的方法

标签(空格分隔): Android so 第三方库


为了执行效率,会将一些CPU密集性任务如音视频解码、图像处理等放入到so中,还有也会将程序关键核心部分放入到so中,这样增加了逆向的难度。下面将so引入分成本地和第三方两种类型。本地是指包含有源码的。这是不讲如何编译和Android.mk的编写,主要讲在Android项目中如何引入so。

本地so

引入本地的so分成三个步骤:

  1. ndk项目的编译;

    这部分网上资料会很多,主要注意事项是函数名格式,如一个类的全名是com.example.firstProgram.ClassName,定义的native函数名为function,则在so中的函数名必须为Java_com_example_firstProgram_ClassName_function,这样通过jni才能找到对应的函数,还有必须要按照C语言的编译和链接规范,,即在C++文件中要使用extern “C”

  2. 类中引入so;

    首先要引入对应的so文件,将引入的代码放入到类的static代码块,这样在加载类时会首先将so加载进来。代码:

static{
System.loadLibrary("XXX");//XXX为so文件名
}
  1. 将编译后的so引入到项目中lib库下。

    即使将jni目录放入到项目下,但项目打包时并不会将so文件放入到lib目录下,要通过设置才可以。

    找到app目录下的build.gradle,加入下面内容:

    sourceSets {
    main {
    jniLibs.srcDirs = ['../libs']
    }

    ‘../libs’是表示so文件的目录,相对于build.gradle当前文件位置的。

    经过上面三步,就可以将so包含到Android项目中了。


第三方so

由于第三方so没有源代码,只提供接口,就需要首先自己创建本地so,通过本地C/C++代码来调用第三方so的函数。这里的主要配置是在jni目录下的Android.mk文件中。有两种方式:

  1. 需要将第三方so放入到/system/lib下

    这种方式类似于引用系统提供的库,需要在Android.mk中提供

    LOCAL_LDLIBS := -lXXX

    在将该so文件放入到/system/lib目录下,这种方式适合在root机器或模拟器上进行测试不需要,不用将so打包到apk中。

  2. 打包到apk中

    在jni新建目录如prebuilt,我们这里以libsubstrate.so为例,将libsubstrate.so文件放入到prebuilt目录,并新建Android.mk文件,内容为:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := substrate
    LOCAL_SRC_FILES := libsubstrate.so
    include $(PREBUILT_SHARED_LIBRARY)

然后jni目录中的Android.mk中添加下面内容:

LOCAL_SHARED_LIBRARIES := substrate #上述模块名

并在文件末尾添加:

include $(LOCAL_PATH)/prebuilt/Android.mk

这样apk打包会将该so文件打包进去,但运行还是有问题,什么问题呢?。。。。。

对了,只是将so文件打包到apk中了,并没有加载进去,和之前一样,在类的static代码块中加入System.loadLibrary(“XXX”),这样在就可以正常运行使用了。


总结

由于刚加入到Android阵营中,这些东西都是很基础的,很多内容都是来源于网上,内容很分散,刚开始找的话很费时费力,因此将这些东西整理到起来。方便自己和他人的学习。

Android引入动态库so的方法的更多相关文章

  1. GO编译时不避免引入外部动态库的解决方法

    简介 最近碰到一个问题,有一个流量采集的组件中使用到了github.com/google/gopacket 这个库,这个库使用一切正常,但是唯独有一个缺点,编译后的二进制文件依赖于libpcap.so ...

  2. Android:动态库(.so)调试技巧

    一.反汇编定位crash ①查看crash log: 上图已标出crash发生在 libdeflicker_gpu.so 库中的 default_fail_func() 函数,但是 libdeflic ...

  3. Visual Studio - 引入动态库

    以VS2013为例: 1.新建项目 2.选择"Win32控制台应用程序",点确定 勾选“控制台应用程序”和“空项目”选项,点击完成,然后新建一个C文件,在文件头上右键: 3.粘贴准 ...

  4. Ubuntu中程序部署时无法加载动态库的解决方法

    Ubuntu下修改环境变量的三种方法 添加环境变量无法解决,可尝试如下操作: sudo vim /etc/ld.so.conf 在ld.so.conf中加入动态库的目录... 然后 sudo ldco ...

  5. 替换应用程序DLL动态库的详细方法步骤 (gts.dll为例)

    在C++ builder编译器IDE软件下 1.View -Project Manageer --找到需要替换的x.dll(gts.dll)对应的x.lib(gts.lib),然后Remove2.Pr ...

  6. Android:JNI与NDK(二)交叉编译与动态库,静态库

    欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...

  7. FFmpeg 1.2 for Android 生成一个动态库

    上一篇<FFmpeg 1.2 for Android 编译动态库>里沃特跟大家介绍了如何编译动态库,但当时所生成的动态库总共包含10个so文件,这样要是加载起来会严重影响软件的启动速度,后 ...

  8. Linux 创建静态库(.a)和动态库(.so)

    0. 回顾一下 gcc 选项 ============================================== -E : 仅做预处理,例如去注释,宏展开,include 展开等 -S : ...

  9. VC 静态库与动态库(三)动态库创建与使用_隐式链接

    动态库分为二种,一种隐式链接,另一种显示调用.不论哪种动态库,本质都是运行时动态加载 隐式链接:程序运行时,由编译系统自动加载动态库,然后根据程序的引入表进行重定位,当程序退出时自动卸载动态库 显示调 ...

随机推荐

  1. ubuntu解压命令(转)

    -c: 建立压缩档案 -x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的参数是 ...

  2. 《Practical Vim》第八章:利用动作命令在文档中移动

    面向单词的移动 定义: Vim 提供了面向单词的动作命令,用于将光标正向/反向移动一个单词; 功能 命令 正向移动到下一单词开头 w 反向移动到上一单词的开头 b 正向移动到下一单词(当前单词)的结尾 ...

  3. 雷林鹏分享:jQuery EasyUI 数据网格 - 使用虚拟滚动视图显示海量数据

    jQuery EasyUI 数据网格 - 使用虚拟滚动视图显示海量数据 数据网格(datagrid)的虚拟滚动特性可以用来显示大数量的记录而不需要分页. 当滚动垂直滚动条时,数据网格(datagrid ...

  4. linux软件管理之yum管理rpm包

    YUM 使用官方源 ==================================================================================== 阿里镜像站 ...

  5. Caffarelli 关于自由边界正则性的论文C1

    Caffarelli 关于自由边界正则性的论文 接下来主要想叙述一下Caffarelli的C1文章中的一些想法,这是最近这几天看的文献. 对于从自由边界的Lipschitz正则性到$C^{1,\alp ...

  6. emacs初步学习

    一.安装扩展 安装web-mode.el扩展,本来试试打算试试格式化freemarker,另外一篇吐槽了freemarker,不用了. 这个emacs也花了点时间,稍微整理一下. 1.确定.emacs ...

  7. weinre 远程调试 安装 配置

    1.第一种方法:安装:npm install -g weinre 2.第一种方法:开启本地监听服务器(修改端口,默认端口是8080):在cmd中运行: weinre --httpPort 8101 - ...

  8. Beta 冲刺 (3/7)

    Beta 冲刺 (3/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 参与开发关键词提醒部分 展示GitHu ...

  9. nginx 支持的命令行参数

    Command-line parameters 命令行参数 nginx supports the following command-line parameters: nginx支持以下命令行参数 - ...

  10. ubuntu svn服务本地搭建使用

    安装 sudo apt-get install subversion 创建一个仓库 svnadmin create mysvn 编辑配置文件  /home/exayong/mysvn就是上面创建的目录 ...