近日做Android项目,引用的第三方包需要依赖JNI。
特意在网上查了一下AndroidStudio如何导入.so文件,发现有很多不同的方式,有简单的也要比较复杂的,而且有的方式还是错误的(说多了都是泪啊),为了避免很多人在第一次导入so浪费太多时间,在此教大家一种最简单的导入方式。
大家使用过Eclipse的都知道,Eclipse中导入.so文件很简单,根据支持的CPU框架直接放在/libs目录下面就好了,项目打包时会直接就打包到了apk中。然而AndrodStudio这样做却不行,它只会把识别jar打包到apk中,而so文件就被遗忘在风中,这是为什么呢?
其实我们只要认真看看项目工程中的module下的build.gradle中的代码我们就能明白,为什么libs中jar能被打包到apk中,而so文件却不能。
compile fileTree(dir:'libs',include: ['*.jar']) 就是这句代码申明了将项目中/libs下的jar一起打包到apk中。
那么问题来了,是不是我们把这个地方的 *.jar换成 */*.so (因为so文件有多种CPU支持,所以要在前面加上*/)就可以将so文件一起打包到apk中了呢?答案当然是不可以,因为这种方式仅支持jar类型。
其实要想将so文件打包到apk中,和上面的也差不多,只需要在build.gradle里面申明一下就好了。
在build.gradle中的android下面添加
sourceSets {
main {
jniLibs.srcDirs= ['libs']
}
}
这串代码,就可以实现将module下libs中的so一起打包到apk中了。
sourceSets是Android打包时资源集,包含了很多目录资源指向,如:src、libs、res等目录都是在这里面指定了路径,ide才会在编译的时候去编译路径下面的资源代码。
main就和我们java的class中的main方法一样,是sourceSets的执行主入口方法。
jniLibs表示jni引用libs,.srcDirs用于指定路径。
(以上内容纯属个人看法,有不对的地方望大家提出改正)