Android Studio(以下简称AS)引入jni开发后,可以调用C/C++代码,未开发带来极大的便利,C/C++的编译执行效率也要比java代码高,而且还可引用第三方动态库或者静态库,避免了二次开发。
下面介绍如何在AS中如何实现引用第三方库(以opus库为例),这里使用的是经典的Android.mk。
1. 如何将默认的CMake编译方式调整为Android.mk,不在赘述,详情查看如下链接:
http://blog.csdn.net/xy_kok/article/details/72876758
2. 经过修改后Android.mk中指定了jni库的编译规则,这里需要做的是将其重命名。由于个人原因同一个模块下只允许存在一个Android.mk文件。这里重命名为opusjni.mk,代码如下:
从示例代码中可以看出,文中引用了一个名为static_opus的动态库,这个稍后会依据opus库编译出来。
3. jni文件所在cpp目录下创建include和libs目录,分别存放第三方所用的头文件和库。如下图所示
4. 如上图所示,在cpp目录下新建一个opuslib.mk的文件,主要指定第三方lib库的编译规则,该文件内容如下:
从示例中不难看出,文件以libs目录下的libopus.so为源文件,将其预构建成一个名为libstatic_opus.so的动态库。
注意:文中使用libopus.so必须符合规定abi中所指定平台架构,可以从网上找对应平台的库,当然为了安全最好是,下载源码,配置交叉编译环境,编译平台所需的目标库。
5. 在第2步中我们将Android.mk文件重命名了,所以要再为build.gradle配置一个新的Android.mk文件,并将上述步骤中的opuslib.mk 和 opusjni.mk串联起来,内容如下:
注意:最好将所有的mk文件都放在同一级目录下,否则在串联mk文件中,容易发生目录混淆的问题。
6. Application.mk文件内容如下:
APP_STL := stlport_static
APP_ALLOW_MISSING_DEPS=true
7. 最后如果依然无法通过编译,则把要使用的库都放到sdk的ndk-bundle目录下去
./ndk-bundle/platforms/android-24/arch-arm/usr/lib/libopus.so
./ndk-bundle/platforms/android-24/arch-arm64/usr/lib/libopus.so
这里默认链接24版本,如果分不清的话,可以写个脚本或者批处理把库复制到所有的版本下去。