前言:
上一篇博客我們講到了Android studio 開發jni的基本配置,這一篇博客我們主要講java和c++之間通過jni是如何交互的.
- 我們先創建兩個方法,一個是java調用c++,一個是c++調用java的方法
- java調用的c++方法需要使用"native"進行修飾,表示是一個本地方法,不需要進行實現.
- 我們要c++中創建一個與java一樣的方法
根據上圖的標記的順序進行講解:
1.include 可以理解成java中的import
2."JNIEXPORT" 同java中的jni方法要被native修飾一樣
3.方法名就是對應java中包名_類名_方法名
4.JNIEnv:JNIEnv 可以說是整個 JNI 的核心類,是 Java 和 C 通訊的橋樑,它可以協助我們將
JNI 類型轉換成 C 類型,不僅如此,調用 Java 對象的方法,獲取或者修改屬性,都是由 JNIEnv 來做。
- jstring就是java中傳來的一個參數,在java裏面是String,在這裏是jstring
- 這是一張java-jni數據數據類型對應表
- 接下來我們看看是如何調用java的方法的
- 通過上面的代碼我們可能發現了在參數裏面出現了 jclass 和 jobject 兩個不同類型的參數,它是起到什麼作用jclass:可以看java中的class,jobject:可以看做java中的this
- 獲取java中有參數的方法 如:env->GetMethodID(class,"",sig)對於最後一個參數代表的java中的參數類型,這時候會產生一個 疑問,如何填寫這樣的參數,
boolean:Z
、byte:B
、char:C
、short:S
、int:I
、long:J
、float:F
、double:D
、void:V
、[數組]:[和類型
Object對象:L包名/類名; 或 包名/類名$標識嵌套類;
例子(方法 ->- 對應的sig):
Java方法 | 對應的sig |
---|---|
void M1(int A,int B) |
"(II)V" |
void M2(String S) |
"(Ljava/lang/String;)V" |
void M3(int[] I) |
"([I)V" |
String M4(String S,int index) |
|
- 上面的表格中就是一些基本的參數,大家可以參看練習,舉一反三
已經就是jni使用的一些基本函數, 上面代碼的demo我會同步到github
Android技術交流:973579144