在JNI中訪問JAVA類中的整型、浮點型、字元型的資料比較簡單,舉一個簡單的例子,如下:
//得到類名jclass cls = (*env)->GetObjectClass(env, obj);//得到Java類中的變數NumberjfieldID fNumber = (*env)->GetStaticFieldID(env, cls, "Number", "I");//將JNI中也就是C代碼中的nJniNumber的值設定到fNumber中,其實也就將值設定給Java類中的Number(*env)->SetStaticIntField(env, cls, fNumber, nJniNumber);
但是對於一維數組和二維數組在JNI中的使用方法跟上面的有一定的差別,也有點麻煩,下面我們就看看怎麼使用。
在網上找到的一段代碼,基上顯示了JNI中二維數組的使用,覺得不錯,我又將代碼進行了一些整理,如下:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData) { jint i,j; int row = (*env)->GetArrayLength(env, arrayData);//獲得行數 jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, 0)); int col =(*env)->GetArrayLength(env, myarray); //獲得列數 jint jniData[row][col]; for (i = 0; i < row; i++){ myarray = ((*env)->GetObjectArrayElement(env, arrayData, i)); jint *coldata = (*env)->GetIntArrayElements(env, (jintArray)myarray, 0 ); for (j=0; j<col; j++) { jniData [i] [j] = coldata[j]; //取出JAVA類中arrayData的資料,並賦值給JNI中的數組 } (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 ); } }
其中,arrayData是通過參數將Java中定義的一個二維數組int[][] testArray = new int[50][50]傳遞過來的;
一、在上面例子中只是得到數組中的資料,那麼如何設定數組中的資料呢? 我們來看一下下面的代碼:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData) { jin i,j; jint count = 10; jint jniData[10][10]; for(i=0; i < count; i++) { for(j = 0 ; i < count; j++ { jniData[i][j] = i*(i+j); } } for (i = 0; i < row; i++){ { //得到數組的首地址 jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, i)); //將jni數組的count個元素複製給myarray數組 (*env)->SetIntArrayRegion(env, myarray, 0, count,jniData[i]); (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 ); }}
如果arrayData是一維數組的話,將上面的for迴圈去掉就可以了。
二、一維的字串數組怎麼設定資料呢?我們來看下面的代碼:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData) { jin i; char temp[100]; jint count = (*env)->GetArrayLength(env, arrayStringData); for (i = 0; i < count; i++){ { memset(temp,0,100); sprintf(temp,"str:%d",i); //得到一個jstring的資料 jstring str = (*env)->NewStringUTF(env, temp); //將str設定給arrayStringData的第i個元素。 (*env)->SetObjectArrayElement(env, arrayStringData, i, str); }}
其中,arrayStringData是通過參將Java中定義的一個一維數組String[] testArray = new String[50]傳遞過的;
三、二維的字串資料怎麼設定資料?請看下面的代碼:
Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData) { jin i,j; char temp[100]; jint count = (*env)->GetArrayLength(env, arrayStringData); for (i = 0; i < count; i++){ { //得到一行資料 jarray myarray = ((*env)->GetObjectArrayElement(env, arrayStringData, i)); jint count1 = (*env)->GetArrayLength(env,myarray); for(j=0; j < count1; j++) { memset(temp,0,100); sprintf(temp,"str:%d",i*(i+j)); //得到一個jstring的資料 jstring str = (*env)->NewStringUTF(env, temp); //將str設定給arrayStringData的第j個元素。 (*env)->SetObjectArrayElement(env, myarray, j, str); } }}
其中,arrayStringData是通過參數將Java中定義的一個二維數組String[][] testArray = new String[50][50]傳遞過的。
四、上面的訪問數組的方法都是通過參數傳遞的方式實現的,如何不通過參數傳遞在JNI中直接得到數組進行操作呢?
我在網上尋找相關的資料和文章,也有這方面的介紹,我在使用他們的方法時,程式總是出錯,不知道什麼原因,因此,至今仍然沒有搞明白怎樣才能夠不通過參數傳遞的方式直接存取JAVA中的數組。
我在論壇中發過貼子,也沒有找到相應的方法,論壇的貼子如下:
http://topic.csdn.net/u/20120315/10/f956498c-ed93-4d4f-bfb2-cc1719de61d7.html
如果你有什麼好的見意的話,可以給我私信或留言,謝謝。