博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android jni 编程4(对基本类型二维整型数组的操作)
阅读量:5114 次
发布时间:2019-06-13

本文共 4519 字,大约阅读时间需要 15 分钟。

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
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
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
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
          //数组元素操作区域-------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); }

效果:

转载于:https://www.cnblogs.com/shuqingstudy/p/4908952.html

你可能感兴趣的文章
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
遍历Map对象
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
(转)Android之发送短信的两种方式
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>