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);
- }
效果:
Android jni 编程4(对基本类型二维整型数组的操作)的更多相关文章
- Android jni 编程3(对基本类型一维整型数组的操作)总结版
主要学习资料:黑马程序员的NDK方法使用(生产类库so) jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...
- Android jni 编程2(对基本类型一维整型数组的操作)
参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...
- Android jni 编程(参数的传递,成员,方法的)相互访问
package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...
- 对二维数组使用指针进行操作的探索(C语言)
/* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...
- 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...
- 【转】Android JNI编程—JNI基础
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
- 【转】android JNI编程 一些技巧(整理)
原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...
- Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...
- Android jni 编程入门
本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...
随机推荐
- ZOJ 3931 Exact Compression
题目看了半小时才看懂的. 题意:首先根据给出的序列,构造出哈夫曼树,构造出来的是一棵二叉树,每个节点都有一个权值,每个节点的两个儿子只能取一个,问能否使取出来的节点权值之和刚好等于e. 这样一分析就很 ...
- Android获取手机唯一码
大部分安卓手机都可以获取手机唯一码,但是有些手机的厂商却禁止了获取手机唯一码的权限,导致我们不能使用手机唯一码作为标识,但遇到一些必须要填的坑,我们也不能不填,所以使用以下方法来填坑,因此我们使用UU ...
- RecyclerView学习笔记
主要方法: setLayoutManager:设置显示方式,有LinearLayoutManager(像ListView一样的纵向列表布局),有GridLayoutManager(网格布局),有Sta ...
- 远程开户系统开放API接口
如今随着智能识别技术的成熟和商用,金融领域也开始逐渐试水"远程开户".从OCR身份证识别到人脸识别,到如今市场上即将出现完整的远程开户系统,除了需要成熟的技术做支撑外,还需要对市场 ...
- UVa 374 - Big Mod
题目大意:计算R = BP mod M,根据模运算的性质计算. 正常计算会超时,可以用分治的思想降低时间复杂度.不过如果遇到00,结果...话说00的结果是1吗?忘了都... #include < ...
- mysql 常用指令
修改表的字符集 88down voteaccepted If you want to change the table default character set and all character ...
- jquery $提示缺少对象$提示缺少对象
jquery $提示缺少对象 项目中存在不同版本的jquery,有1.4也有1.2, 之前运行项目不会报错 " $提示缺少对象 ",但是我的IE9重置之后就报错,从网上找了一大堆, ...
- Ubuntu切换默认语言
不得不说,从Ubuntu到Debian,又到CentOS 7,我胡汉三又回来了... 然后又装了个中文版的Ubuntu16.04LTS,不得不说,Ubuntu对中文的支持真的很好 不过,还是不太习惯, ...
- UVa 103 - Stacking Boxes
题目大意:矩阵嵌套,不过维数是多维的.有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < bi,则盒子A可嵌套在盒子 ...
- linux 同步机制之complete【转】
转自: http://blog.csdn.net/wealoong/article/details/8490654 在Linux内核中,completion是一种简单的同步机制,标志"thi ...