Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> android學習筆記----JNI中的c控制java,android----jni

android學習筆記----JNI中的c控制java,android----jni

編輯:關於android開發

android學習筆記----JNI中的c控制java,android----jni


面向對象的底層實現
     

      java作為面向對象高級語言,可對現實世界進行建模。和面向過程不同的是面向對象軟件的編寫不是流程的堆積,而是對業務邏輯的多視角分解和分類。其過程大致為:
      1)、將知識分解成不同粒度的小概念。
      2)、對概念進行分類,形成類、模塊、系統
      3)、用計算機語言將其實現為對象(包含操作和數據)

      然而,大多程序員編寫代碼時很少思考面向對象的體系是如何實現的。因為它屬於底層,並不必要。但是,學習過Java反射技術並有所思考的人會意識到,面向對象的種種語法本身也是有意思的系統。例如,屬性本身是Field類的對象,方法是Method類的對象,甚至類也是Class類對象。

 

JNI學習總結


      JNI是android中java與c的交互協議,它規定了java代碼與c代碼之間的相互調用、變量存取、新建對象等操作。java是面向對象語言,而c是面向過程語言。兩者在語法和解決問題的思維方式上有所區別,那麼如何解決其中的沖突呢?
      答案就是,深入到面向對象體系底層去,以屬性、方法、類為單位進行操作。java的類跑在VM中,每一個對象、每一個方法、每一個屬性、每一個類都由虛擬機進行管理,然後映射為底層二進制數據儲存在內存中。因此,如果有一個VM的接口暴露給程序員,可以想象會發生什麼事。我們可以不用new就新建對象,不用點調用函數,不用賦值號給屬性賦值。我們可以通過請求VM,直接對屬性、方法、類進行操作,這裡與Java的反射機制有類似的地方。不一樣的是,JNI中c調用java是用c語法而非java語法,c中直接通過關聯到VM的指針做各種VM級的操作。
      總而言之,c調用java的整體思路就是通過VM對類、方法、屬性和對象的管理實現面向對象動作的分解。

c中從當前對象thiz中獲取類:
jclass clazz = (*env)->GetObjectClass(env,thiz);

從類中獲取某函數ID:
jmethodID m_mid = (*env)->GetMethodID(env,clazz,"setV","(I)V");

使用對象和函數ID調用java對象裡的對象函數(類函數使用類ID):
(*env)->CallVoidMethod(env,thiz,m_mid,data);

從類中獲取屬性ID:
jFiledID m_fid = (*env)->GetFiledID(env,clazz,"data","I");

使用對象和屬性ID取java對象裡的值:
int n = (int)(*env)->GetObjectFiled(env,thiz,m_fid);

獲取某個類:
jclass rvclass = (*env)->FindClass(env,"com/misoo/counter/ResultValue");

類中獲取構造函數ID:
jmethodID constr = (*env)->GetMethodID(env,rvclass,"<init>","()V");

新建對象:
jobject ref = (*env)->NewObject(env,rvclass,constr);

 

*以上env是指針變量,指向一個可以處理VM請求的對象。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved