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 程 ...
随机推荐
- Run Loop简介 分类: ios技术 ios相关 2015-03-11 22:21 73人阅读 评论(0) 收藏
做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...
- WebService调用权限验证 SoapHeader
一般在项目中,制作的都是基于SOAP协议的webservices,其描述语言是WSDL.但是有时候在项目中,需要保证webservices的安全,需要对其进行进行验证,那么我们就要实现SoapHead ...
- mySql 分段查询
准备: 创建一个成绩表 Create table grade (id integer, score integer); 插入数据(只有id每次加一,score是1到100的随机数,java生成): p ...
- iOS 按钮设置图片和事件
[btn addTarget:self action:@selector(searchButtonClick) forControlEvents:UIControlEventTouchUpInside ...
- 安卓版php服务器的mysql数据库增删改查简单案例
界面: index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- ASP.NET MVC TempData使用心得
说明: 在ASP.NET MVC中資料傳遞主要有ViewData與TempData ViewData主要是Controller傳遞Data給View,存留期只有一個Action,要跨Action要使用 ...
- Delphi中上指定进程(进程名)
procedure KillProcess(ExeName: string); const PROCESS_TERMINATE = $0001; //进程的PROCESS_TERMINATE访问权限 ...
- jQuery学习笔记之jQuery.fn.init()的参数分析
这篇文章主要介绍了jQuery.fn.init()的参数分析,需要的朋友可以参考下 从return new jQuery.fn.init( selector, context, rootjQuer ...
- Java 页面的工具包
所谓工具包,是指把页面的功能划分出来,放到另外一个包里面.方面工程管理.结构清晰.团队协作等. 根据原来的例子:要做一个com.myweb包的工具包com.myweb.tool 为导航栏统一创建接口 ...
- ImageView及其子类(二)
实例:强大的图片按钮 下面的实例定义了多个图片按钮,并定义了两个ZoomButton.两个ZoomButton的android:src属性分别指定为@android:drawable/btn_minu ...