android .so 动态库,Android引入动态库so的方法

Android引入动态库so的方法

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

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

本地so

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

ndk项目的编译;

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

类中引入so;

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

static{

System.loadLibrary("XXX");//XXX为so文件名

}

将编译后的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文件中。有两种方式:

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

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

LOCAL_LDLIBS := -lXXX

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

打包到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. 兼容性问题:so文件可能是不适用于目标设备架构的,例如将一个ARM架构的so文件引入到x86架构的设备上,会导致错误。解决该问题的方法是确保引入的so文件与设备的架构兼容。 2. 缺少依赖:so文件往往会依赖其他的库文件,如果缺少了这些依赖,就会导致so文件加载失败。解决该问题的方法是检查并确保引入的so文件的依赖完整,并将其一同引入。 3. 编译配置问题:有时候,在引入so文件时,可能会遇到编译配置不正确的问题。比如,编译时使用的编译选项与so文件不匹配,或者编译时使用的Android NDK版本与so文件不兼容。解决该问题的方法是检查编译配置,并调整为与so文件相匹配的设置。 4. 路径错误:在引入so文件时,可能会发生路径错误,导致无法正确找到so文件。解决该问题的方法是确认so文件的路径是否正确,并进行相应的调整。 对于上述问题,可以通过以下方式进行排查和解决: 1. 检查设备的架构,确认so文件与设备架构兼容。 2. 检查so文件的依赖,并确保完整引入。 3. 检查编译配置,确保与so文件相匹配。 4. 检查so文件的路径,并进行调整。 总之,在处理安卓开发中引入so文件的报错时,需要综合考虑架构兼容性、依赖关系、编译配置和路径等因素,以找到并解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值