【詳解】JNI (Java Native Interface) (三)

案例三:C代碼訪問Java對象的實例變量html

    獲取對象的實例變量的步驟:java

  1. 經過GetObjectClass()方法得到此對象的類引用數組

  2. 經過類引用的GetFieldID()方法得到實例變量的Field ID.函數

    你須要提供 變量名字段類型描述符spa

    • 對於Java 類, 字段描述符格式爲 "L<類全稱>;" 類全稱中,點"."用 "/"代替。例如,String 的描述符爲"Ljava/lang/String;"

      注意:這裏不要漏了分號";"htm

    • 對於基本類型,則有固定標識。注:這裏不須要分號。

      int =>  "I" ,byte => "B",short => "S",long => "J",float => "F",double => "D",char => "C",boolean => "Z"對象

    • 對於數組,則結合以上類型描述符,加上前綴"[",

      如Object數組,用"[L/java/lang/Object;"表示blog

      int數組,用"[I"表示get

   3. 基於FieldID,經過GetObjectField()方法或Get<基本類型>Field()方法獲取實例變量。編譯

   4. 若是須要更新實例變量,能夠使用SetObjectField()或Set<基本類型>Field()函數進行

   如下是JNI用於獲取實例變量的函數:(來自於頭文件jni.h)

  

  此案例全部文件:

  

  (1)建立Java程序

       

  定義兩個實例變量,一個爲基本類型,另外一個爲對象類型。利用C代碼對其進行更改,而後輸出結果,校驗其實例變量是否改變。

   (2)編譯Java程序,並生成相關頭文件

       

  

   (3)編寫源文件實現。

   

  根據上述描述的獲取成員變量的步驟進行。

  注:因爲String在c語言中沒有直接映射的類型,只能經過相關函數轉換爲以'\0'結尾的字符數組。

   (4)生成動態連接庫,注這裏直接指定庫名爲libdemo3.so,至於爲什麼要加前綴lib,請看前文

  

   (5)執行Java程序

  

   由圖可知,C代碼成功改變了Java對象實例變量的值。

 

  

相關文章
相關標籤/搜索