Android進階JNI開發(二)

前言:

上一篇博客我們講到了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的方法的
    靜態調用方式
  •  
非靜態方法
調用java的靜態字段
  • 通過上面的代碼我們可能發現了在參數裏面出現了 jclass 和 jobject 兩個不同類型的參數,它是起到什麼作用jclass:可以看java中的class,jobject:可以看做java中的this
  • 獲取java中有參數的方法  如:env->GetMethodID(class,"",sig)對於最後一個參數代表的java中的參數類型,這時候會產生一個 疑問,如何填寫這樣的參數,
  • boolean:Zbyte:Bchar:Cshort:Sint:Ilong:Jfloat:Fdouble:Dvoid: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)
 
"(Ljava/lang/String;I)V"
  • 上面的表格中就是一些基本的參數,大家可以參看練習,舉一反三

 

已經就是jni使用的一些基本函數, 上面代碼的demo我會同步到github

Android技術交流:973579144

我的github開源項目

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章