JNI中的jclass和jobject


jclass和jobject的迷惑
第一次使用JNI,實例引用(jobject)和類引用(jclass)讓人覺得很困惑。
實例引用與一個數組和java.lang.Object類或它的子類的實例對應。類引用與java.lang.Class實例對應,它代表着類的類型。
一個操作如GetFieldID,需要參數jclass,是一個類操作,因為它從一個類中獲得field的描述。與此相反,GetIntField需要參數jobject,這是一個實例操作,因為它從這個實例中獲得這個field的值。在所有的JNI方法中jobject和實例操作的結合和jclass和類操作的結合保持一致。所以是很容易記住類操作與實例操作的不同的。

 

隨后,普及下靜態方法和實例方法的區別:

靜態方法與靜態變量一樣,屬於 本身,而不屬於那個類的一個對象。調用一個被定義為static的方法,可以通過在它前面加上這個類的名稱,也可以像調用非靜態方法一樣通過類對象調用。
實例方法必須通過類的實例來使用。實例方法可以使用類的非靜態成員,也可以使用類的靜態成員。
類的靜態方法,靜態變量是在類裝載的時候裝載的。但是要特別注意,類的靜態變量是該類的對象所共有的,即是所有對象共享變量。所以建議盡量少用靜態變量。盡量在靜態方法中使用內部變量。
 
其中 static關鍵字即表示靜態的。聲明靜態方法的語法如下:
<訪問修飾符> static返回類型 方法名(參數列表)
{//方法體}
 
靜態方法與實例方法唯一不同的,就是靜態方法在返回類型前加 static關鍵字。靜態方法的調用有兩種途徑:
(1)通過類的實例對象去調用
調用格式為: 對象名.方法名
(2) 通過類名直接調用
調用格式為: 類名::方法名
 
對於JNI的頭文件的區別:
/* * Class: com_nedu_jni_helloword_HeaderFile * Method: doInt * Signature: (DD)I */ JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DD (JNIEnv *, jobject, jdouble, jdouble); /* * Class: com_nedu_jni_helloword_HeaderFile * Method: doInt * Signature: (DDD)I */ JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DDD (JNIEnv *, jclass, jdouble, jdouble, jdouble);
這里可以看到參數列表的第二個參數的類型不一樣,第一個是jobject,表明這個函數是一個實例方法,指向這個實例;而下面的是jclass,表明是個靜態方法,指向這個類的class


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM