1、關於原生代碼的聲明
/*靜態native方法聲明*/
public static native String stringFromJni();
/*native方法聲明*/
public native String stringFromJni();
2、原生方法實現
這兩種方式在實現上會有略微不同
用javah的命令行工具生成的頭文件,分別爲
jString Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz );
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jclass clazz );
其中,JNIEnv是指向JNI函數表的接口指針,jobject是包含native方法的類實例的對象引用。由於靜態方法沒辦法與實例綁定,所以jclass獲取的是類引用而非實例引用
mStore *store = new mStore();
jobject ptr = env->NewDirectByteBuffer(store, 0);
mStore *store = (mStore *) env->GetDirectBufferAddress(ptr);
將C++ 中的某個對象轉化成jobject對象進行存儲,可傳遞到java端進行序列化存儲,下次不需要再次創建,native方法需要使用ByteBuffer方式進行序列化,切記
public nativeByteBuffer open(String name, String path, long size, int type,boolean compressMode);
---------------------------------------------------------------------------------------------------------------------------------------------------
const char *nameStr = env->GetStringUTFChars(name,0);
env->ReleaseStringUTFChars(name,nameStr);
將native中的jstring轉成 char* 用於進行C 與java的字符串轉換,下面方法切記使用,要釋放申請的內存空間,否則容易導致內存泄露。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
jbyteArray array = env->NewByteArray(size);
env->SetByteArrayRegion(array,0,size,body);
jclass stringClass = env->FindClass("java/lang/String");
jobjectArray array = env->NewObjectArray(size,stringClass,NULL);
jstring tempFirst = env->NewStringUTF(store->getFirstKey());
env->DeleteLocalRef(stringClass);
env->DeleteLocalRef(tempFirst);
以上爲創建各種Array類型,比較常用的jobjectArray可以通過env調用java層的類進行直接操作,最後要記得刪除掉相關的引用,防止產生內存泄露
------------------------------------------------------------------------------------------------------------------------------------
void * keyPtr = env->GetByteArrayElements(key, 0);
env->ReleaseByteArrayElements(key,(jbyte *) keyPtr,0);
將native的jbyteArray轉成C中的Byte類型的指針,用於存儲字符串。