1.下載并配置NDK
配置NDK環(huán)境網(wǎng)上挺多的,這里就不提了表伦,本文使用的Android Studio版本為2.2,NDK版本為r13b鳄哭。
2.新建項(xiàng)目JniDemo
1.新建類JniUtil,聲明所需要的native方法:getJniAdd(int a,int b),代碼如下:
public class JniUtil {
static {
System.loadLibrary("JniUtil");
}
public static native int getJniAdd(int a, int b);
}
2.生成Java文件中native方法相對(duì)應(yīng)的jin層c代碼接口
在AS界面的Terminal窗口中執(zhí)行命令:cd app/src/main/java
定位至java文件夾妆丘,然后再執(zhí)行命令:javah -jni com.richsoft.jnidemo.JniUtil
注意"com.richsoft.jnidemo"是JniUtil所在的包名勺拣。
此時(shí)在app/src/main/java路徑下生成了一個(gè).h文件药有,如圖:
3.新建jni文件夾
app->new->Floder->JNI Folder,如下圖:
點(diǎn)擊之后彈出選擇框:
點(diǎn)擊finish之后苇经,main文件夾下生成jni文件夾扇单,如下圖:
4.實(shí)現(xiàn)項(xiàng)目中聲明的Native方法
在jni目錄下創(chuàng)建JniUtil.c文件,然后將com_richsoft_jnidemo_JniUtil.h中的方法拷貝至JniUtil.c中蜘澜,并實(shí)現(xiàn)這個(gè)方法鄙信,如下代碼:
#include<jni.h>
JNIEXPORT jint JNICALL Java_com_richsoft_jnidemo_JniUtil_getJniAdd
(JNIEnv *env, jclass cls, jint a, jint b) {
return a + b;
}
3.編譯.so文件
在gradle.properties文件末尾添加上“android.useDeprecatedNdk=true”
然后在app文件下build.grade->defaultConfig括號(hào)內(nèi)添加如下代碼:
ndk {
moduleName "JniUtil" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a" ,"x86"http://輸出指定三種abi體系結(jié)構(gòu)下的so庫扮碧,目前可有可無杏糙。
}
這里提一下:
- mips / mips64: 極少用于手機(jī)可以忽略
- x86 / x86_64: x86 架構(gòu)的手機(jī)都會(huì)包含由 Intel 提供的稱為 Houdini** 的指令集動(dòng)態(tài)轉(zhuǎn)碼工具宏侍,實(shí)現(xiàn) 對(duì) arm .so 的兼容谅河,再考慮 x86 1% 以下的市場(chǎng)占有率确丢,x86 相關(guān)的兩個(gè) .so 也是可以忽略的
- armeabi: ARM v5 這是相當(dāng)老舊的一個(gè)版本,缺少對(duì)浮點(diǎn)數(shù)計(jì)算的硬件支持褂始,在需要大量計(jì)算時(shí)有性能瓶頸
- armeabi-v7a: ARM v7 目前主流版本
- arm64-v8a: 64位支持
點(diǎn)擊Build下的Make Project,成功之后打開app->intermediates->ndk->debug發(fā)現(xiàn)了四個(gè)文件夾,如下圖:
到此崎苗,生成.so文件的過程結(jié)束舀寓。
在src\main下新建jniLibs文件夾互墓,將上面的四個(gè)文件夾拷貝至jniLibs文件夾下篡撵,如圖:
將jni文件夾和.h文件刪除,如下圖:
最后咱們?cè)囋嚿傻?so文件能不能用祷杈,貼下MainActivity代碼:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText("java調(diào)用C語言實(shí)現(xiàn)的加法運(yùn)算:2+1000=" + JniUtil.getJniAdd(2, 10000));
}
}
運(yùn)行下程序但汞,結(jié)果如下: