android – JNI – 一維數組、二維數組的訪問與使用

來源:互聯網
上載者:User

在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

如果你有什麼好的見意的話,可以給我私信或留言,謝謝。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.