前言
前一篇文章我们编译好了一个so文件(或者一个个独立的so,为了方便,我合并成一个so文件)。那么如何在Android Studio(后面简称AS)中导入ffmpeg以及使用呢?
1. AS的jni支持
AS从1.3开始支持jni,可以在src/main/jni目录下新建C或者C++的文件,AS会自动编译并打包至apk中,但是as目前对于更加复杂的C模块支持还不是很好,在gradle的实验版本里正在加入完善的jni支持,可以看这里http://tools.android.com/tech-docs/new-build-system/gradle-experimental。我暂时禁用了AS的jni功能,自行通过ndk-build生成native模块。然后在AS中调用。
2. jni目录配置
首先我们在项目的app/main目录下新建一个jni目录,并将编译好的libffmpeg.so 和include目录拷贝到jni目录下, 然后新建一个Android.mk
文件。
Android.mk
文件内容如下:
上面的代码里的LOCAL_MODULE := hello-android-jni
是我们编译后的ndk模块名,LOCAL_SRC_FILES := hello-android-jni.c
是模块源文件。我们在jni目录下新建hello-android-jni.c
,填入以下内容:
在jni目录下运行ndk-build
来编译(ndk-build在/path/to/ndk/ndk-build下),我们会发现自动生成了和jni同级的目录libs和obj:
gradle配置
由于gradle默认的jniLibs并没有这个路径下的目录,并且我们要防止gradle默认的jni行为,所以我们修改gradle文件,加入以下内容:
完整的build.gradle看起来应该是这样的(可能略有差别
在Java类里调用jni
要在Java程序里调用native的函数,我们必须加载so库,加载方式很简单,
回到我们刚才创建的C程序里的函数名Java_me_zheteng_android_ffmpeg_MainActivity_getMsgFromJni
,jni命名规则是这样的Java_包名(点变下划线)_类名_函数名
,所以我们的类名是me.zheteng.android.ffmepg.MainActivity
,在MainActivity中声明这个函数:
调用这个函数就能获取到我们编译ffmpeg时所用的参数。
完整的Activity代码如下:
运行结果
运行结果如下图所示: