zoukankan      html  css  js  c++  java
  • Android jni 编程4(对基本类型二维整型数组的操作)

    Android jni 编程

    对于整型二维数组操作:

      类型一:传入二维整型数组,返回一个整型值

      类型二:传入二维整型数组,返回一个二维整型数组

    声明方法:

    private native int SumArray2D(int [][]ar2d);//传一个二维数组,返回一个长度 
         
    private native int [][] ModifyArray2d(int [][]ar2d);//传入一个二维数组,更改后返回一个二维数组

    C语言实现

    对于类型一:

    /**
     *     要点:演示对传入二维数组的访问
     *  功能:计算二维数组的和
     *    NewObjectArray( env,len,jcIntArray,NULL );
     *    参数2:是要创建的元数个数
     *    参数3:是要创建的元素的类型
     *    参数4:是创建时的初值,可以传空
     */
    JNIEXPORT jint JNICALL Java_com_swust_array2_MainActivity_SumArray2D
      (JNIEnv * env, jobject obj, jobjectArray arr2D){
        int len = 0,length = 0;
            int i,j,sum=0;
            jarray jaIntArray;
            jintArray jiaTmpIntArray;
            jobjectArray joaReturnInt2DArray;//定义一个数组指针,到时候返回用
            jclass jcIntArray;
            jboolean jbIsCopy = JNI_FALSE;
    
            len = (*env)->GetArrayLength( env, arr2D );//获取第一维的元数长度
            jaIntArray =  (*env)->GetObjectArrayElement(env, arr2D, 0);//获取第0个元素 ,它是一个一维数组首地址
            length = (*env)->GetArrayLength( env, jaIntArray );//获取一维数组的长度
    
            jcIntArray = (*env)->FindClass( env, "[I" );//得到一个一维数组的引用
            joaReturnInt2DArray = (*env)->NewObjectArray( env,len,jcIntArray,NULL );//创建len个jcIntArray.
    
            for(i=0;i<len;i++)
            {
                jint *piSrc,*piDes;
    
                jaIntArray =  (*env)->GetObjectArrayElement(env, arr2D, i);//void*指针
                jiaTmpIntArray = (*env)->NewIntArray( env, length );//void*指针,元素个数是length
    
                piSrc = (*env)->GetIntArrayElements( env,jaIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
                piDes = (*env)->GetIntArrayElements( env,jiaTmpIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
    
                for(j=0;j<length;j++)
                {
                    piDes[j] = piSrc[j];//把传入数组的值,赋给新创建的数组
                    sum +=piDes[j];//通过新创建数的值。累计
                }
    
                (*env)->ReleaseIntArrayElements( env,jaIntArray,piSrc,0 );//对应的释放函数
                (*env)->ReleaseIntArrayElements( env,jiaTmpIntArray,piDes,0 );//对应的释放函数
    
                (*env)->SetObjectArrayElement( env, joaReturnInt2DArray, i, jiaTmpIntArray );//将新建的一维数组,做为二维数组的元素
                (*env)->DeleteLocalRef( env, jiaTmpIntArray );//删掉这个引用.
            }
    
            (*env)->DeleteLocalRef( env, joaReturnInt2DArray );//释放整个创建的二维数组
    
            return sum;
    }

    对于类型2:

    /*
     * 要点:
     *    1:访问传入的二维数组
     *    2:创建一个新的二维数组
     *    3:修改传入的二维数组的值
     *    4:返回一个二维数组对象给java调用端
     */
    JNIEXPORT jobjectArray JNICALL Java_com_swust_array2_MainActivity_ModifyArray2d
    (JNIEnv * env, jobject obj, jobjectArray arr2D){
            int len = 0,length = 0;
                int i,j;
                jarray jaIntArray;
                jintArray jiaTmpIntArray;
                jobjectArray joaReturnInt2DArray;//定义一个数组指针,到时候返回用
                jclass jcIntArray;
                jboolean jbIsCopy = JNI_FALSE;
    
                len = (*env)->GetArrayLength( env, arr2D );//获取第一维的元数长度
                jaIntArray =  (*env)->GetObjectArrayElement(env, arr2D, 0);//获取第0个元素 ,它是一个一维数组首地址
                length = (*env)->GetArrayLength( env, jaIntArray );//获取一维数组的长度
    
                jcIntArray = (*env)->FindClass( env, "[I" );//得到一个一维数组的引用
                joaReturnInt2DArray = (*env)->NewObjectArray( env,len,jcIntArray,NULL );//创建len个jcIntArray.
    
                for(i=0;i<len;i++)
                {
                    jint *piSrc,*piDes;
    
                    jaIntArray =  (*env)->GetObjectArrayElement(env, arr2D, i);//void*指针
                    jiaTmpIntArray = (*env)->NewIntArray( env, length );//void*指针,元素个数是length
    
                    piSrc = (*env)->GetIntArrayElements( env,jaIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
                    piDes = (*env)->GetIntArrayElements( env,jiaTmpIntArray,&jbIsCopy );//这里还是获取首地址,得到的是jin*类型的了
    
                    for(j=0;j<length;j++)
                    {
                        piDes[j] = piSrc[j];//把传入数组的值,赋给新创建的数组
              //数组元素操作区域-------start------
                        piDes[j] = 5;//修改传入数组的值
              
              //数组元素操作区域-------end------

    } (*env)->ReleaseIntArrayElements( env,jaIntArray,piSrc,0 );//对应的释放函数 (*env)->ReleaseIntArrayElements( env,jiaTmpIntArray,piDes,0 );//对应的释放函数 (*env)->SetObjectArrayElement( env, joaReturnInt2DArray, i, jiaTmpIntArray );//将新建的一维数组,做为二维数组的元素 (*env)->DeleteLocalRef( env, jiaTmpIntArray );//删掉这个引用. } // (*env)->DeleteLocalRef( env, joaReturnInt2DArray );//释放整个创建的二维数组 return joaReturnInt2DArray; }

    在Java中调用本地方法

     public void click(View v){
             //访问二维数组,累计和,
                int arr2d[][] = {{1,2,3,4},{2,3,4,5,}};//new int[2][4];
                int sum = SumArray2D(arr2d);        
                Log.d("wsq", "原二维数组和sum = " + sum);
                
                //访问二维数组,并返回一个二维数组,且修改了传入二维数组的元素
                int arr2dA[][] = null;
                int sumV = 0;        
                arr2dA = ModifyArray2d(arr2d);
                for(int i=0;i<2;i++)
                {
                    for(int j=0;j<4;j++)
                    {   System.out.println(arr2dA[i][j]);
                        sumV += arr2dA[i][j];                
                    }            
                }    
                Log.d("wsq", "更改二维整型数组后,sumV = " + sumV);
         }

    效果:

  • 相关阅读:
    一个人的旅行 dij(),评测的时候有点惨
    CodeFroce Round 340 div2 E XOR and Favorite Number【莫队算法】
    [HihoCoder-1185] 连通性·三 【tarjan+缩点】
    2017百度之星初赛(A)1001,1005,1006解题报告
    HDU 5961&AOJ 821 传递
    pair
    优先队列 priority_queue
    ccf 201903-5
    memset 和 fill 的区别
    ccf 20190302
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/4908952.html
Copyright © 2011-2022 走看看