android NDK 使用JNI實現與原生代碼通信

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獲取的是類引用而非實例引用

原生代碼通過JNIEnv接口指針提供的各種函數來使用虛擬機的功能,JNIEnv是一個指向線程-局部數據的指針,而線程-局部數據中包含指向函數表的指針。

這裏我們需要注意的是,傳遞給每一個原生方法調用的JNIEnv接口指針在與方法調用相關的線程中也有效,但是它不能被緩存,也不能被其他線程使用。

3、JNIEnv中經常用到的方法如下:

    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類型的指針,用於存儲字符串。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章