• android


    android - JNI - 一维数组、二维数组的访问与使用

     转载自CSDN博主http://topic.csdn.net/u/20120315/10/f956498c-ed93-4d4f-bfb2-cc1719de61d7.html

    在JNI中访问JAVA类中的整型、浮点型、字符型的数据比较简单,举一个简单的例子,如下:

     

    [java] view plain copy
     
    1. //得到类名  
    2. jclass cls = (*env)->GetObjectClass(env, obj);  
    3. //得到Java类中的变量Number  
    4. jfieldID fNumber = (*env)->GetStaticFieldID(env, cls, "Number""I");  
    5. //将JNI中也就是C代码中的nJniNumber的值设置到fNumber中,其实也就将值设置给Java类中的Number  
    6. (*env)->SetStaticIntField(env, cls, fNumber, nJniNumber);  

    但是对于一维数组和二维数组在JNI中的使用方法跟上面的有一定的差别,也有点麻烦,下面我们就看看怎么使用。

    在网上找到的一段代码,基上显示了JNI中二维数组的使用,觉得不错,我又将代码进行了一些整理,如下:

     

     

    [cpp] view plain copy
     
    1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData)      
    2. {   
    3.    
    4.       jint i,j;    
    5.     
    6.       int row = (*env)->GetArrayLength(env, arrayData);//获得行数      
    7.   
    8.       jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, 0));    
    9.     
    10.       int col =(*env)->GetArrayLength(env, myarray); //获得列数    
    11.     
    12.       jint jniData[row][col];         
    13.     
    14.       for (i = 0; i < row; i++){    
    15.     
    16.           myarray = ((*env)->GetObjectArrayElement(env, arrayData, i));    
    17.     
    18.           jint *coldata = (*env)->GetIntArrayElements(env, (jintArray)myarray, 0 );    
    19.     
    20.           for (j=0; j<col; j++) {    
    21.               jniData [i] [j] = coldata[j]; //取出JAVA类中arrayData的数据,并赋值给JNI中的数组  
    22.           }    
    23.   
    24.          (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 );  
    25.     
    26.       }    
    27.     
    28. }    

    其中,arrayData是通过参数将Java中定义的一个二维数组int[][] testArray = new int[50][50]传递过来的;

     

     

    一、在上面例子中只是得到数组中的数据,那么如何设置数组中的数据呢? 我们来看一下下面的代码:

     

    [cpp] view plain copy
     
    1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData)    
    2. {  
    3.      jin i,j;  
    4.   
    5.      jint count = 10;  
    6.   
    7.      jint jniData[10][10];  
    8.   
    9.   
    10.      for(i=0; i < count; i++)  
    11.      {  
    12.          for(j = 0 ; i < count; j++  
    13.          {  
    14.              jniData[i][j] = i*(i+j);  
    15.          }  
    16.      }  
    17.   
    18.      for (i = 0; i < row; i++){   
    19.      {  
    20.          //得到数组的首地址  
    21.          jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, i));  
    22.            
    23.          //将jni数组的count个元素复制给myarray数组  
    24.          (*env)->SetIntArrayRegion(env, myarray, 0, count,jniData[i]);  
    25.           
    26.          (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 );  
    27.      }  
    28. }  

    如果arrayData是一维数组的话,将上面的for循环去掉就可以了。

     

     

    二、一维的字符串数组怎么设置数据呢?我们来看下面的代码:

     

    [cpp] view plain copy
     
    1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData)    
    2. {  
    3.      jin i;  
    4.   
    5.      char temp[100];  
    6.       
    7.      jint count = (*env)->GetArrayLength(env, arrayStringData);  
    8.   
    9.      for (i = 0; i < count; i++){   
    10.      {  
    11.          memset(temp,0,100);  
    12.          sprintf(temp,"str:%d",i);  
    13.          
    14.          //得到一个jstring的数据  
    15.          jstring str = (*env)->NewStringUTF(env, temp);  
    16.   
    17.          //将str设置给arrayStringData的第i个元素。  
    18.          (*env)->SetObjectArrayElement(env, arrayStringData, i, str);  
    19.      }  
    20. }  

    其中,arrayStringData是通过参将Java中定义的一个一维数组String[] testArray = new String[50]传递过的;

     

     

    三、二维的字符串数据怎么设置数据?请看下面的代码:

     

    [cpp] view plain copy
     
    1. Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData)    
    2. {  
    3.      jin i,j;   
    4.   
    5.      char temp[100];  
    6.   
    7.      jint count = (*env)->GetArrayLength(env, arrayStringData);  
    8.   
    9.      for (i = 0; i < count; i++){   
    10.      {  
    11.          //得到一行数据  
    12.      jarray myarray = ((*env)->GetObjectArrayElement(env, arrayStringData, i));  
    13.            
    14.          jint count1 = (*env)->GetArrayLength(env,myarray);  
    15.          for(j=0; j < count1; j++)  
    16.          {  
    17.              memset(temp,0,100);  
    18.              sprintf(temp,"str:%d",i*(i+j));  
    19.   
    20.              //得到一个jstring的数据  
    21.              jstring str = (*env)->NewStringUTF(env, temp);  
    22.   
    23.              //将str设置给arrayStringData的第j个元素。  
    24.              (*env)->SetObjectArrayElement(env, myarray, j, str);  
    25.          }  
    26.      }  
    27. }  

    其中,arrayStringData是通过参数将Java中定义的一个二维数组String[][] testArray = new String[50][50]传递过的。

     

     

    四、上面的访问数组的方法都是通过参数传递的方式实现的,如何不通过参数传递在JNI中直接得到数组进行操作呢?
    我在网上查找相关的资料和文章,也有这方面的介绍,我在使用他们的方法时,程序总是出错,不知道什么原因,因此,至今仍然没有搞明白怎样才能够不通过参数传递的方式直接访问JAVA中的数组。
    我在论坛中发过贴子,也没有找到相应的方法,论坛的贴子如下:

    http://topic.csdn.net/u/20120315/10/f956498c-ed93-4d4f-bfb2-cc1719de61d7.html

     

    如果你有什么好的见意的话,可以给我私信或留言,谢谢。

  • 相关阅读:
    基于jQuery的上下无缝滚动应用(单行或多行)
    表单验证
    中国剩余定理 ( 的学习 )
    扩展欧几里德算法--学习笔记
    Vijos P1794 文化之旅
    1336 : Matrix Sum (hihocoder)
    nyoj 1030 hihocoder 1338
    多重邻接表
    图的存储 ( 十字链表 )
    01背包的变形
  • 原文地址:https://www.cnblogs.com/qianheng/p/12203049.html
Copyright © 2020-2023  润新知