第一步:新建一個java類,比如我新建MyJNI.java,並且在裏面加載項目的so庫,比如我的項目名字爲JNITest,就loadLibrary("JNITest"),
並且定義自己要使用的方法
public class MyJNI {
//加載so庫
static {
System.loadLibrary("JNITest");
}
//需要在Activity中用到的方法
public static native String printHello();
}
第二步:使用javac命令生成MyJNI的class文件:javac MyJNI.java
第三步:生成.h文件:打開命令行跳轉到:項目的根目錄->app->src->main->java,然後輸入 javah -jni 你的類的包名.類名,比如我的是:
javah -jni com.example.ll.jnitest.MyJNI,成功後會app->src->main->java下面生成一個.h文件,比如我的是:
com_example_ll_jnitest.MyJNI.h
第四步:在app->src->main下面新建文件夾jni,然後在裏面新建c/c++文件,比如我新建Test.c文件,然後把上一步生成的.h文件裏面的內容全部
複製到裏面並且實現裏面的方法,我的是:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_lloydfinch_rxjavatest_MyJNI */
#ifndef _Included_com_example_lloydfinch_rxjavatest_MyJNI
#define _Included_com_example_lloydfinch_rxjavatest_MyJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_lloydfinch_rxjavatest_MyJNI
* Method: printHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_lloydfinch_rxjavatest_MyJNI_printHello
(JNIEnv *env, jclass jobj){
return (*env)->NewStringUTF(env,"JNI Test!");
}
#ifdef __cplusplus
}
#endif
#endif
第五步:在jni文件夾下新建一個空白的util.c文件
第六步:配置環境,在local.properties文件中設置ndk的路徑,比如我的是:
ndk.dir=/Users/lloydfinch/venn/soft/sdk/android-sdk-macosx/ndk-bundle,然後在app下面的build.gradle裏面的
defaultConfig裏面添加:
ndk {
moduleName "JNITest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
然後在gradle.properties文件的最後一行添加:android.useDeprecatedNdk=true 即可
第七步:生成so文件:rebuild一下你的項目,即可在 app\build\intermediates\ndk\debug\lib下面生成一堆文件
第八步:配置和使用,在app->src->main->java下面新建文件夾jniLIB,然後將上一步生成的so文件全部複製到此處,然後在我們的Activity裏面
就可以直接調用第一步的java類裏面聲明的方法了:String str = MyJNI.printHello();