zoukankan      html  css  js  c++  java
  • 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


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

  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6829306.html
Copyright © 2011-2022 走看看