[android ndk]android studio動態庫生成及jni底層呼叫步驟
阿新 • • 發佈:2019-02-20
android studio動態庫生成及jni底層呼叫步驟
1、建立一個用於關聯c程式碼的類(對映類)
方法名需要加native修飾
public class NDKUtils {
public static native int getSum(int a, int b);
}
2、使用javah生成標頭檔案【可選】–>目的是為了拿到函式的宣告
進入到app\src\main\java ,使用javah 全類名(上面建立的對映類,不要有中文註釋)
找到生成的c檔案拿到函式宣告(注意此處是沒有引數名的哦):
JNIEXPORT jint JNICALL Java_com_jwkj_ffmpeg_NDKUtils_getSum (JNIEnv *, jclass, jint, jint);
3、建立c實現的檔案(eg:ndkutils.c)
android studio切換到Project預覽模式,找到src/main,新建jni資料夾,然後新建一個對應的c檔案,將上面拿到的函式宣告拷貝到c檔案中。(記得自己帶上引數名,如env clazz a b)
#include "stdio.h"
#include "jni.h"
JNIEXPORT jint JNICALL Java_com_jwkj_ffmpeg_NDKUtils_getSum
(JNIEnv *env, jclass clazz, jint a, jint b) {
return a+b;
}
4、配置gradle
找到app的gradle,在defaultConfig裡面新增:
ndk {
moduleName "ndkDemo" //生成的so庫名字
abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫。
}
5、Make Project
Make成功之後,即可在app/build/intermediates/ndk下產生so動態庫檔案
6、為對映類關聯庫檔案
1、在src/main下面建立jniLibs資料夾;
2、將動態庫檔案(連同資料夾一起)拷貝到src/main
public class NDKUtils { static { System.loadLibrary("ndkDemo"); } public static native int getSum(int a, int b); }
3、此時可以將jni目錄下的程式碼全部刪除(已經不需要)
4、最後的目錄結構圖和gragle配置圖
7、使用ndk
public class MainActivity extends AppCompatActivity {
private TextView tvReuslt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvReuslt = (TextView) findViewById(R.id.tv_result);
tvReuslt.append(NDKUtils.getSum(4, 2) + "");
}
}
執行結果: