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

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

//得到类名
jclass cls = (*env)->GetObjectClass(env, obj);
//得到Java类中的变量Number
jfieldID 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


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




  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值