java jni 方法描述,五、JNI提供的函数介绍(一):类和对象操作
如果你要開始JNI編程,你還需要了解JNI提供了哪些函數供你調用。
這些函數都定義在了jni.h文件,包括上一篇文章介紹的數據類型,也都在這個頭文件中。
類和對象操作
假設你要在JNI層使用C代碼創建一個Java對象,并對其屬性賦值,并返回這個對象到Java層,需要哪些操作?
1.找到這個類
2.實例化這個類
3.找到這個對象的屬性并對其賦值或者找到并調用可以對其屬性賦值的方法
4.return 這個對象
對應以上四個步驟,JNI都提供了相應的函數:
1.查找類 ->FindClass函數 ,或者從一個現成的jobject從獲取jclass -> GetObjectClass函數,或者定義類DefineClass函數
2.實例化這個類 -> AllocObject函數或NewObject函數(附有帶V版和帶A版),得到jobject
3.找到這個對象的屬性->GetFieldID函數(靜態屬性使用GetStaticFieldID函數)得到jfiledID,
或者找到可調用的方法->GetMethodID函數(靜態方法使用GetStaticMethodID函數)得到jmethodID
對屬性賦值->SetField函數,調用方法CallMethod函數
4.return jobject
其他類和對象的操作函數:
1.IsAssignableFrom函數:是用來判斷一個類Class1和另一個類Class2是否相同或是另一個類的子類或接口
2.IsSameObject函數:從函數名稱上就可以看出是判斷兩個對象是否是同一個對象
3.IsInstanceOf函數:判斷一個對象是否是一個類的實例
4.GetSuperclass函數:獲取一個jclass的父jclass
說明:
1.SetField函數中是根據屬性數據類型變化的,例如數據類型為int,那么函數就是SetIntField函數
具體如下圖:
八種基本數據類型都有對應的方法,其他引用類型統一使用SetObjectFiled函數,看上面第二圖,有set當然也有get啦
如果是靜態屬性的話,jni也是提供好了:
2.CallMethod函數中是根據返回值變化的,例如返回值為int,則函數為CallIntMethod
具體如下圖:
如上兩圖,每個方法都有附屬兩個版本——帶V版和帶A版,這個不是重點,先忽略他們。
可以發現的取值就是八種基本數據類型、Object和void
而V版和A版與什么都不帶的版本區別僅僅在于最后一個方法參數(Java參數列表)的數據類型不同
JNI也定義了靜態方法的調用函數:
形式與非靜態方法相似
CallNonvirtalShortMethod(jobject obj, jclazz clazz, jmethodID methodID, ...);
在實際開發中(時刻App服務端JNI),將結構體一 一賦值到到Java對象返回到Java層出現了一些莫名其妙的問題,后來改成將結構體序列化為json返回到Java層,
這個問題今晚(2015/12/18)剛好已經解決,是因為Java類屬性為Integer類型,jni不能直接返回jint類型,而是需要new 一個Integer的jobject返回到Java層,避免麻煩,我把類屬性都換成了int類型,不再出現莫名其妙崩潰的問題。但是結構體一一賦值給java對象屬性編寫太麻煩,還經常出問題,傳遞復雜數據類型,我更傾向于使用傳遞Json的形式。
加我QQ:981656164,共同學習交流,記得備注 —— OSC! ?~~
總結
以上是生活随笔為你收集整理的java jni 方法描述,五、JNI提供的函数介绍(一):类和对象操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php分布式cache,thinkPHP
- 下一篇: wps如何和matlab兼容,怎样使wp