在JNI中访问JAVA类中的整型、浮点型、字符型的数据比较简单,举一个简单的例子,如下:

//得到类名
jclass cls = (*env)->GetObjectClass(env, obj);
//得到Java类中的变量Number
jfieldID fNumber = (*env)->GetStaticFieldID(env, cls, "Number", "I");
//将JNI中也就是C代码中的nJniNumber的值设置到fNumber中,其实也就将值设置给Java类中的Number
(*env)->SetStaticIntField(env, cls, fNumber, nJniNumber);

但是对于一维数组和二维数组在JNI中的使用方法跟上面的有一定的差别,也有点麻烦,下面我们就看看怎么使用。

在网上找到的一段代码,基上显示了JNI中二维数组的使用,觉得不错,我又将代码进行了一些整理,如下:

Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData)
{ jint i,j; int row = (*env)->GetArrayLength(env, arrayData);//获得行数 jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, 0)); int col =(*env)->GetArrayLength(env, myarray); //获得列数 jint jniData[row][col]; for (i = 0; i < row; i++){ myarray = ((*env)->GetObjectArrayElement(env, arrayData, i)); jint *coldata = (*env)->GetIntArrayElements(env, (jintArray)myarray, 0 ); for (j=0; j<col; j++) {
jniData [i] [j] = coldata[j]; //取出JAVA类中arrayData的数据,并赋值给JNI中的数组
} (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 ); } }

其中,arrayData是通过参数将Java中定义的一个二维数组int[][] testArray = new int[50][50]传递过来的;

一、在上面例子中只是得到数组中的数据,那么如何设置数组中的数据呢? 我们来看一下下面的代码:

Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayData)
{
jin i,j; jint count = 10; jint jniData[10][10]; for(i=0; i < count; i++)
{
for(j = 0 ; i < count; j++
{
jniData[i][j] = i*(i+j);
}
} for (i = 0; i < row; i++){
{
//得到数组的首地址
jarray myarray = ((*env)->GetObjectArrayElement(env, arrayData, i)); //将jni数组的count个元素给myarray数组
(*env)->SetIntArrayRegion(env, myarray, 0, count,jniData[i]); (*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 );
}
}

如果arrayData是一维数组的话,将上面的for循环去掉就可以了。

二、一维的字符串数组怎么设置数据呢?我们来看下面的代码:

Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData)
{
jin i; char temp[100]; jint count = (*env)->GetArrayLength(env, arrayStringData); for (i = 0; i < count; i++){
{
memset(temp,0,100);
sprintf(temp,"str:%d",i); //得到一个jstring的数据
jstring str = (*env)->NewStringUTF(env, temp); //将str设置给arrayStringData的第i个元素。
(*env)->SetObjectArrayElement(env, arrayStringData, i, str);
}
}

其中,arrayStringData是通过参将Java中定义的一个一维数组String[] testArray = new String[50]传递过的;

三、二维的字符串数据怎么设置数据?请看下面的代码:

Java_com_array_arrayTest_arrayUse( JNIEnv* env,jobject thiz,jobjectArray arrayStringData)
{
jin i,j; char temp[100]; jint count = (*env)->GetArrayLength(env, arrayStringData); for (i = 0; i < count; i++){
{
//得到一行数据
jarray myarray = ((*env)->GetObjectArrayElement(env, arrayStringData, i)); jint count1 = (*env)->GetArrayLength(env,myarray);
for(j=0; j < count1; j++)
{
memset(temp,0,100);
sprintf(temp,"str:%d",i*(i+j)); //得到一个jstring的数据
jstring str = (*env)->NewStringUTF(env, temp); //将str设置给arrayStringData的第j个元素。
(*env)->SetObjectArrayElement(env, myarray, j, str);
}
}
}

其中,arrayStringData是通过参数将Java中定义的一个二维数组String[][] testArray = new String[50][50]传递过的。

四、上面的访问数组的方法都是通过参数传递的方式实现的,如何不通过参数传递在JNI中直接得到数组进行操作呢?
我在网上查找相关的资料和文章,也有这方面的介绍,我在使用他们的方法时,程序总是出错,不知道什么原因,因此,至今仍然没有搞明白怎样才能够不通过参数传递的方式直接访问JAVA中的数组。
我在论坛中发过贴子,也没有找到相应的方法,论坛的贴子如下:

http://topic.csdn.net/u/20120315/10/f956498c-ed93-4d4f-bfb2-cc1719de61d7.html

如果你有什么好的见意的话,可以给我私信或留言,谢谢。

android JNI 一维数组、二维数组的访问与使用的更多相关文章

  1. Java基本语法-----java数组(一维数组二维数组)

    嘿嘿!你们懂的,又是图片,委屈大家了. java数组(一维数组二维数组) [正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!下面有个"顶"字,你就 ...

  2. Java一维与二维数组的拷贝与排序

    Java一维与二维数组的拷贝与排序 目录 Java一维与二维数组的拷贝与排序 Arrays.sort() 一维数组升序排序 二维数组按行升序排序 二维数组按列升序排序 Java中的数组 Java中数组 ...

  3. 数据结构 二维数组-->稀疏数组-->二维数组

    稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不 ...

  4. php获取一维,二维数组长度的方法(有实例)

    在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧.php如何获取数组的长度,使用php函数c ...

  5. Java 一维数组 二维数组 三维数组

    二维数组包含一位数组  三维数组就是在二维数组的基础上,再加一层.把二维数组看做是一维数组就可以了,按照上述理解类推.   下面是 一维 二维 三维数组例子   一维数组: int[] array1 ...

  6. 10-20C#基础---一维、二维数组&&冒泡排序

    一.一维数组 1.定义:是某一种数据类型的数据的组合,数组用来分组基本类型或相同类型的对象.数组中的实体叫做数组的元素或成员. 2. 格式:int[ ] shuzu=new int[ 6];存放int ...

  7. Java一维数组二维数组详解API

    所谓数组,是有序的元素序列. 若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量.用于区分数组的各个元素的数字编号称为下标 ...

  8. egret之一维,二维数组

    一维数组转换成二维数组下标公式: 行=下标/二维数组列数 列=下标%二维数组列数+1 ] + ); ] + ); 二维数组转一维数组: 下标=(二维数当前行-1)*列数+二维数当前列-1: let i ...

  9. 一维、二维数组 与 常用的返回数组 以及 fetch_all与fetch_row的区别

    一维数组:单行单列的数组. 二维数组:多行多列的数组.       (至少两行两列) 索引数组: fetch_all() 返回所有数组 fetch_row() 返回一行或一列数组  (第二行需要输入两 ...

  10. 《Java基础知识》一维,二维数组的申明和使用

    为什么要使用数组: 因为不使用数组计算多个变量的时候太繁琐,不利于数据的处理. --------   数组也是一个变量,是存储一组相同类型的变量 声明一个变量就是在内存中划出一块合适的空间 声明一个数 ...

随机推荐

  1. ASP.NET-AJAX.FORM提交附件失败

    尝试了不少时间在AJAX.FORM提交附件,发现完全不行,经过下面的这个博客的介绍,使用ajax.form.js插件提交成功,记录一下该博文网址和结论: 相关网址:http://www.cnblogs ...

  2. ASP.NET-服务器客户端的信息保持

    ASP.NET客户端和服务器端的信息保持方案 来自为知笔记(Wiz)

  3. Tomcat example 应用信息泄漏漏洞及修复

    Tomcat 是一款开源的 Web 应用服务器软件.Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试 JSP 程序的首选. 漏洞描述 Tomcat 在 ...

  4. 随心所欲生成git仓库随意一段commit的专用patch应用小实践

     随心所欲生成git仓库随意一段commit的专用patch应用小实践 我们在开发中.时不时的可能要去做一个patch给你的下线,或者你的合作者.在git管理中,我们知道有git format-pat ...

  5. poj3101--Astronomy(分数的最小公倍数)

    题目链接:id=3101">点击打开链接 题目大意:有n个行星,给出每个行星的旋转的周期.问最少多少时间后n个行星会在一条直线上,初始点在一起,不存在全部的行星都有同一个周期 如果A行 ...

  6. WPF错误:必须使“Property”具有非 null 值。

    这个问题一般出如今Triggers中Property指定的类型为Nullable. 解决的方法就是用DataTrigger取代Trigger, 然后用Binding+Converter转换为详细非Nu ...

  7. nyoj--747--蚂蚁的难题(三)(dp背包)

    蚂蚁的难题(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:4 描述 蚂蚁终于把尽可能多的食材都搬回家了,现在开始了大厨计划. 已知一共有 n 件食材,每件食材有一个美味度  ...

  8. java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)

    转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...

  9. HDU 4190 Distributing Ballot Boxes【二分答案】

    题意:给出n个城市,n个城市分别的居民,m个盒子,为了让每个人都投上票,问每个盒子应该装多少张票 二分盒子装的票数, 如果mid<=m,说明偏大了,r应该向下逼近 ,r=mid 如果mid> ...

  10. jq 鼠标点击跳转页面后 改变点击菜单的样式代码

    点击菜单跳转页面,然而跳转后的页面字体并没有加粗用如下代码 <div class="bg01 menu"> <img class="img01" ...