书接上文:CMake构建NDK项目生成so库
上文中我们创建了一个Android Studio默认CMake构建的NDK项目:NDKLearn

- 1 是生成的so库
- 2 是java层调用类的包名和类名
接下来创建一个新的项目作为第三方应用来调用我们刚才生成的so库:

这里的【Include C++ support】可选可不选,这里我就不选了。一路next 创建,一个默认的android项目创建成功:

下面就是怎么使用以及调用so库了。
首先,将so文件拷贝到libs下,然后创建和so库编译时的类(NDKLibrary)类名和包名完全一致的类,最终成了:

另外因为so库放到了libs下,所以还需要在app 目录下build.gradle里配置一下:
android{
....
....
// 引入so库
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
一切就绪,现在就可以在MainActivity里调用了:

运行后结果:

以上是一种调so+源码文件的方式来调用,完全可行,但最常用的还是将so库和调用类打包成一个Library提供给第三方调用者,调用者拿到Library后,直接调用其中的方法就可以了。
接下来就到了如何将此项目打成一个jar包
jar包的生成方式有很多,这里介绍下Android Studio不同版本下通过gradle task来打包的方式:
首先将你module下的build.gradle改造一下:

1.改为library
2.注释掉applicationId
在Android2.0时代,jar输出到build - intermediates - bundles下:
task makeJar(type: Copy) {
//删除存在的
delete'build/libs/name.jar'
//设置拷贝的文件
from('build/intermediates/bundles/default/')
//打进jar包后的文件目录
into('build/libs/')
//将classes.jar放入build/libs/目录下
//include ,exclude参数来设置过滤
include('classes.jar')
//重命名
rename ('classes.jar','name.jar')
}
makeJar.dependsOn(build)
Android studio3.1.2的时候,bundles目录不存在了,已改为packaged-classes. 没有的话选中你的module,然后build选项- make module 一下就有了:

然后重写下Task,修改下输出路径 :
task makeJar(type: Copy) {
//删除存在的
delete'build/libs/name.jar'
//设置拷贝的文件
from('build/intermediates/packaged-classes/release/')
//打进jar包后的文件目录
into('build/libs/')
//将classes.jar放入build/libs/目录下
//include ,exclude参数来设置过滤
//(我们只关心classes.jar这个文件)
include('classes.jar')
//重命名
rename ('classes.jar','name.jar')
}
makeJar.dependsOn(build)
放置到module build.gradle的最外层:

然后右侧-gradle 下的makeJar选项:

即可看到jar包了--class.jar ,图中是我重名后的jar包:

有了so库和jar文件,后续怎么用,其实跟平时你集成第三方sdk一样,有so有jar扔到libs下即可,基本一个用法,这里就不再详述了...
jar~小弟回家吃饭啦。
题外话
以上几篇的文章,足以让我们对NDK开发有个初步的理解和使用,但想要真的做到深入的理解,还得是上手真正的项目去实践出真知,说道此类项目的话,我个人觉得开源的ffmpeg for android是首选,既可以用到NDK开发,同时还能学习到音视频以及c/c++语言的知识,一举多得~后续我也会将自己的学习过程以及经验教训分享出来,欢迎大家加入一起学习进步。
网友评论