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 程 ...
随机推荐
- FZU 1062 洗牌问题
首先有一个规律:当一个数字归位的时候,所有数字都会归位. 因此只需要模拟一个数字就可以了. #include<cstdio> #include<cstring> #includ ...
- 【转】VS2013动态库文件的创建及其使用详解
一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2.”确定“——”下一步“,选择”DLL“选项,再点”完成“: 3.菜单栏选择”项目“— ...
- dom4j生成和解析xml文件
dom4j生成和解析xml文件 要生成和解析如下格式的xml文件: <?xml version="1.0" encoding="UTF-8"?> & ...
- android 后台服务定时通知
最近有个项目的要求是在程序退出之后,任然可以每天定时发通知,我们可以想下,其实就是后台开一个服务,然后时间到了就发下通知. 1.首先我们需要用到Service类. 先上代码在慢慢解释 package ...
- Ubuntu14.04 64bit编译u-boot-2016.07提示 Your dtc is too old, please upgrade to dtc 1.4 or newer
Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. Ubuntu14.04 64bit环境下编译u-boot-2016.07提示如下错误: CHK include/conf ...
- 那就用pthon来写个跳板机吧
1.需求 程序一: 1.后台管理 - 堡垒机上创建用户和密码(堡垒机root封装的类,UserProfile表) - .bashrc /usr/bin/python3 /data/bastion.py ...
- NGINX location 配置
location表达式类型 ~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location. = 进 ...
- js原生设计模式——2面向对象编程之继承—多继承
1.单对象克隆 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...
- lepus3.7 天兔监控安装手册 CentOS6.5+mysql5.6
lepus3.7 天兔监控安装配置手册 CentOS6.5+mysql5.6 整体环境 192.168.1.250为监控机 192.168.1.248为被监控机 安装LAMP环境 [root@HE3~ ...
- 用Zephir编写PHP扩展
自从NodeJS,和Golang出来后,很多人都投奔过去了.不为什么,冲着那牛X的性能.那PHP的性能什么时候能提升一下呢?要不然就会被人鄙视了.其实大牛们也深刻体会到了这些威胁,于是都在秘密开发各种 ...