(一)Java調用C方法
1、安裝ndk
在Android Studio的project structure目錄,有個Android NDK location設置。未下載ndk的可以點擊下方的download下載。
2、配置path路徑
在環境變量path中配置ndk的路徑。
3、項目中關聯ndk
在項目的local.properties中添加ndk路徑:
ndk.dir=C:\AndroidDevelop\sdk\ndk-bundle;
在gradle.properties中添加配置,兼容老的ndk:
android.useDeprecatedNdk=true。
4、編寫native方法
private native String sayHello();
5、定義對應的jni文件(.h,.c)
使用javah命令。
-進入main目錄;
--執行命令:
javah -d jni -classpath
C:\Android\sdk\platforms\android-25\android.jar;E:\Github\TestNdk\app\build\intermediates\classes\debug
com.hacjy.demo.textndk.JniTest
說明:-d jni,生成jni目錄;第2個參數是本地sdk的android.jar路徑;第3個參數是.class路徑,絕對路徑,包括包名。
6、生成.h后,創建對應的.c文件
如果遇到編譯失敗的話,需要創建一個empty.c文件。這個是AS2.2.2bug。
7、指定編譯不同的CPU
在app的build.gradle的defaultConfig配置:
ndk{ moduleNae “Hello"http://.so文件的名稱組成:lib+moduleName+.so abiFilters
"armeabi","armeabi-v7a","x86"http://cpu類型 }
8、編譯生成動態鏈接文件
執行rebuild,生成so文件,存放目錄:build\intermediates\ndk\debug\lib
9、調用native方法
先加載so文件:
System.loadLibrary("Hello");
再調用方法。
(二)C調用java方法
步驟與java調用c一樣,它是使用反射的原理,找到jclass對象,進而找到對應的方法method對象,然后創建類對象調用java方法。
重要的是需要使用javap -s命令查看類中所有方法的簽名信息,因為找方法需要用到這個參數。
-查看簽名
-進入main目錄,執行命令:
javap -s -classpath
C:\Android\sdk\platforms\android-25\android.jar;E:\Github\TestNdk\app\build\intermediates\classes\debug
com.hacjy.demo.textndk.JniTest Compiled from "JniTest.java"
步驟如下:
1、加載類得到jclass對象:
jclass jc = (*env)->FindClass(env,"com/hacjy/demo/JniTest");
2、得到對應的方法Method對象:
jmethodId method = (*env)->GetMethodID(env,jc,"sayHello","()V");
3、創建類對象:
jobject obj2 = (*env)->AllowObject(env,jc);
4、調用方法:
(*env)->CallVoidMethod(env,obj2,method);
參考自:http://blog.csdn.net/ccg_201216323/article/details/54563825