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 程 ...
随机推荐
- STM8建立IAR工程
STM8是意法半导体公司出的增强型八位单片机,性能比51单片机强大,而且价格便宜,在商业应用中很受欢迎 在STM8的开发工程中主要有两种开发工具链.第一是使用IAR开发环境,第二十使用cosmic+s ...
- 【转】成为Linux内核高手的四个方法
我曾经问别人如何开始内核编程的学习,他们基本上都说:①如果你不需要了解内核是如何为你工作的,你为何要尝试呢?②你应该订阅Linux内核邮件列表,然后努力去理解.③如果你不去编写针对Linux内核的代码 ...
- java学习(二)--excel导出
public static String writeFile(String fileName, String[][] content) { WritableWorkbook wwb = null; S ...
- JAXB2序列化XML
Jaxb2 实现JavaBean与xml互转 http://zhuchengzzcc.iteye.com/blog/1838702 JAXBContext类,是应用的入口,用于管理XML/Java绑定 ...
- http://begin.lydsy.com/JudgeOnline/problem.php?id=2774(poi病毒)
2774: Poi2000 病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5 Solved: 4[Submit][Status][Web Boa ...
- iOS 之 编外知识点
iOS 使用github iOS 开源库介绍 iOS 优质方案 iOS 开发framework 后端数据库使用 Bomb方案 iOS 错误及解决汇总 后台 之 Bmob 申请苹果企业账号
- WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图(转载)
WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号.在这一章,我将把常见的几种请求瓦片时的URL样式罗列出来,并 ...
- spark使用总结
背景 使用spark开发已有几个月.相比于python/hive,scala/spark学习门槛较高.尤其记得刚开时,举步维艰,进展十分缓慢.不过谢天谢地,这段苦涩(bi)的日子过去了.忆苦思甜,为了 ...
- Spark编程进阶
1.累加器 通常在向Spark传递函数时,比如使用map()函数或者用filter()传条件是,可以使用驱动器程序中定义的变量,但是集群中运行的每个人物都会得到这些变量的一份新 ...
- RF & Microarray
REF[24] 随机森林是一个很好适用于微阵列数据的分类算法: 1.即使大多数的预测变量都是噪音,RF仍然具有优秀的性能,因此不需要对基因进行预选择. 2.能够应用于变量数远远大于观测数据量的情况 3 ...