jni—编译本地方法
上一章有讲WAV转码Mp3,承诺过给到没有jni基础的同学讲下如何编译jni本地方法.
第一步、定义本地方法:
public native String getLameVersion();
//定义本地方法,关键字native
public native void convert(String wavFile, String mp3File);
//这里的lame是本地库的名字,build文件需要声明,下面会讲到
static {
System.loadLibrary("lame");
}
/**
* 更新进度,供C调用,注意这里是C2Java的方法
*
* @param progress
*/
public void updateProgress(int progress) {
Message msg = new Message();
msg.arg1 = progress;
msg.what = 0;
handle.sendMessage(msg);
}
第二步、编译make project生成Class文件,这一步不能忽略,不然后面无法生成头文件!!!:
第三步、进入命令执行栏:
这里有两种方法。
第一种:windows的开始菜单,搜索栏输入cmd,进入doc
第二种:进入AS中的Terminal框中编辑命令:View —>Tool Windows—>Terminal
第四步、通过doc命令,生成本地方法的头文件:
cd <ProjectPath>\app\src\main //这里的ProjectPath指的是项目的路径
javah -d jni -classpath E:\android-sdk-windows-1.5_r3\platforms\android-22\android.jar;..\..\build\intermediates\classes\debug com.example.lameonandroid.activity.Sonlist //这里的classpath后面的参数对应的是你SDK的路径;"..\..\build\intermediates\classes\debug"就是上面第二步JVM编译生成Class文件的路径,至于后面跟着的则是声明本地方法的类名。
这一步之后将会在jni中生成本地方法的头文件,名字就是对应的全类名:
第五步、生成头文件之后你就可以在jni中写你的本地方法内容了即.c的文件,注意函数名必须跟头文件中的一致,不然会报错,要具体实现函数,还需要声明头文件:
.h头文件函数名:
JNIEXPORT void JNICALL Java_com_example_lameonandroid_activity_SongList_convert
(JNIEnv *, jobject, jstring, jstring);
.c文件函数名:
JNIEXPORT void JNICALL Java_com_example_lameonandroid_activity_SongList_convert
(JNIEnv * env, jobject obj, jstring jwav, jstring jmp3)
注意不要被红色标记部分吓到哦,这里不是报错,是因为AS不具备C文件错误检索功能,这里确实很蛋疼,而且如果你jni中的没有出现下面这种情况,恰恰说明你写的东西有问题
,是不是很坑。

声明头文件:
#include "com_example_lameonandroid_activity_SongList.h"
第六步、到了这一步我们才能将外部的库复制到jni中,不然没法编译通过的,放进去就可以写C层的代码了。
第七步、这一步很重要,也很容易忽略,需要在gradle中声明本地库:
"abiFilters"后面的参数是声明不同内核生成对应版本的so库。
又到尾声了,按着这七步来走,编译方面就Ok,至于代码错误就看各位的C功底了,至少不用担心最后编译不了so库,不然就那个啥疼了!!!
