JNI Basic

JNI用法總結
Java側代碼就不要說什麼了, 很簡單:
1.參數傳遞
參數如何從Java代碼傳遞給C代碼的,這裏僅僅牽涉到幾種基本類型:
jstring, jboolean, jobject,jint,jdouble, 比較簡單

2.參數轉化
傳遞過來j-參數,怎麼像使用C代碼一樣使用?這裏就有類型轉化的問題。
a>基本類型可以直接使用, 如double和jdouble可以互用。
b> java對象使用
對象有String對象和通用的Object對象。 處理的方式有點不同。
不要再C/C++中調用Java的方法, C/C++處理完之後, 將數據對象傳出就OK
b1>String對象
GetStringUTFChars取得從Java傳入過來的String對象
ReleaseStringUTFChars 用完之後需要釋放
b2>Object對象
先得到對象的類句柄:
jclass objectClass = (env)->FindClass("com/ostrichmyself/jni/Structure");
然後取該類中, 需要的域句柄:
jfieldID str = (env)->GetFieldID(objectClass,"nameString","Ljava/lang/String;");
jfieldID ival = (env)->GetFieldID(objectClass,"number","I");
傳入的jobject對象, 直接對各個域賦值。
(env)->SetObjectField(theObjet,str,(env)->NewStringUTF("my name is D:"));
(env)->SetShortField(theObjet,ival,10);
如果沒有傳入對象,而是新生成對象,則可以通過
jobject myNewObjet = env->AllocObject(objectClass);

3.Java數組的處理
用GetObjectArrayElement取傳入的數組
用NewObjectArray 構造一個數組

4.資源釋放原則
a1>C/C++ new的對象或者Malloc的對象,當然要由C/C++去釋放
a2>通過JNIEnv的方法new的對象, 如果不需要給Java使用,則必須釋放
a3>通過GetStringUTFChars轉化從Java得到的String對象到UTF,需要開闢內存,使用完Char*時,
務必釋放內存,方法是:ReleaseStringUTFChars


基本涵蓋了Java調用C++/C的語法,沒有研究C調用Java,是覺得沒有必要,c調用Java,說明對Java和C
的優勢不清楚。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章