之前的文章讲解了有关JNI使用方法,这篇文章进阶一点,介绍下JNI操作二维数组的方法。有了之前文章的操作JNI的方法,这里直接上代码了。

Java代码部分

 package com.testjni;

 public class TestJNI
{
private static final int ONE_DIMENSION = 3; private static final int TWO_DIMENSION = 2; public native int test2DimensionArray(int[][] aHoleList); static
{
System.load("D:\\eclipseWebWorkSpace\\testest\\src\\com\\testjni\\libTestJNI_amd64.dll");
} public static void main(String[] args)
{
TestJNI testJNI = new TestJNI(); //测试二维数组
int[][] test = new int[ONE_DIMENSION][TWO_DIMENSION];
System.out.println("\njava before--->");
for (int i = 0; i < ONE_DIMENSION; i++)
{
StringBuilder sb = new StringBuilder("test[");
for (int j = 0; j < TWO_DIMENSION; j++)
{
if (j == 0)
{
sb.append(i).append("] = ").append(test[i][j]).append(" ");
}
else
{
sb.append(test[i][j]).append(" ");
}
}
System.out.println(sb.toString());
}
int res = testJNI.test2DimensionArray(test); System.out.println("\njava after--->res=" + res);
for (int i = 0; i < ONE_DIMENSION; i++)
{
StringBuilder sb = new StringBuilder("test[");
for (int j = 0; j < TWO_DIMENSION; j++)
{
if (j == 0)
{
sb.append(i).append("] = ").append(test[i][j]).append(" ");
}
else
{
sb.append(test[i][j]).append(" ");
}
}
System.out.println(sb.toString());
}
}
}
C头文件
 /* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_testjni_TestJNI */ #ifndef _Included_com_testjni_TestJNI
#define _Included_com_testjni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_testjni_TestJNI
* Method: nativeBsmGetHoleList
* Signature: ([[I)I
*/
JNIEXPORT jint JNICALL Java_com_testjni_TestJNI_test2DimensionArray
(JNIEnv *, jobject, jobjectArray); #ifdef __cplusplus
}
#endif
#endif
C源码文件
 #include <stdio.h>
#include "com_testjni_TestJNI.h" #define ONE_DIMENSION 3
#define TWO_DIMENSION 2
JNIEXPORT jint JNICALL Java_com_testjni_TestJNI_test2DimensionArray(JNIEnv *env, jobject obj, jobjectArray test)
{
int jniTest[ONE_DIMENSION][TWO_DIMENSION];
for (int i = ; i < ONE_DIMENSION; i++)
{
for (int j = ; j < TWO_DIMENSION; j++)
{
jniTest[i][j] = * (i + )+ j;
}
} printf("\njni:\n");
jintArray testArray;
for (int i = ; i < ONE_DIMENSION; i ++)
{
//从输入参数二维数组aHoleList中取出某个一维数组
testArray = (jintArray)env->GetObjectArrayElement(test, i);
printf("testArray[%d]=%d, %d, %d, testArray[0] addr = %d; testArray[1] addr = %d, testArray[2] addr = %d; testArray addr=%d; sizeof(jintArray)=%d\n",
i, testArray[], testArray[], testArray[], &testArray[], &testArray[], &testArray[], testArray, sizeof(jintArray));
//获取一维数组的指针
jint *testP = env->GetIntArrayElements(testArray, NULL);
printf("C before, testP[%d]=%d, %d, testP addr=%d\n", i, testP[], testP[], testP);
//改变数组的值
for (int j = ; j < TWO_DIMENSION; j++)
{
*(testP + j) = jniTest[i][j];
}
printf("C after, testP[%d]=%d, %d, testP addr=%d\n", i, testP[], testP[], testP);
env->ReleaseIntArrayElements(testArray, testP, );
printf("\n");
}
return ;
}
运行结果
java before--->
test[] =
test[] =
test[] = java after--->res=
test[] =
test[] =
test[] = jni:
testArray[]=, , , testArray[] addr = ; testArray[] addr = , testArray[] addr = ; testArray addr=; sizeof(jintArray)=
C before, testP[]=, , testP addr=
C after, testP[]=, , testP addr= testArray[]=, , , testArray[] addr = ; testArray[] addr = , testArray[] addr = ; testArray addr=; sizeof(jintArray)=
C before, testP[]=, , testP addr=
C after, testP[]=, , testP addr= testArray[]=, , , testArray[] addr = ; testArray[] addr = , testArray[] addr = ; testArray addr=; sizeof(jintArray)=
C before, testP[]=, , testP addr=
C after, testP[]=, , testP addr=

总结:掌握C语言的核心知识点指针,各种操作水到渠成。

JNI操作二维数组的更多相关文章

  1. PHP操作 二维数组模拟mysql函数

    PHP操作 二维数组模拟mysql函数<pre>public function monimysqltest(){ $testarray=array( array('ss'=>'1', ...

  2. c语言中如何通过二级指针来操作二维数组

    通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上.之后就可以通过二维指针直接访问了. 参考代码如下,可以看具体注释辅 ...

  3. C语言笔记(二维数组与数值指针)

    一.关于二维数组和二维数组区别 (1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的.所以从内存的角度来分析,一维数组和二维数组其实没有本质区别. (2) 二维数组可以使用一维数 ...

  4. android JNI 一维数组、二维数组的访问与使用

    在JNI中访问JAVA类中的整型.浮点型.字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj) ...

  5. php对二维数组进行相关操作(排序、转换、去空白等)

    php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04   这篇文章主要介绍了php对二维数组进行相关操作,包括php对 ...

  6. C++使用VARIANT实现二维数组的操作

    C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...

  7. [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组

    1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一 ...

  8. python的二维数组操作

    需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...

  9. 对二维数组使用指针进行操作的探索(C语言)

    /* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...

随机推荐

  1. 【剑指Offer面试编程题】题目1522:包含min函数的栈--九度OJ

    题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n&l ...

  2. ZCGL大数据项目优化组件布置

    1.经JMeter并发性能测试,每个HBaseService服务的并发请求上限大概是1K,为了支持5W个并发请求量,需要增加部署节点,相应需要增加部署路由网管Zuul,为了隐藏多个路由网管Zuul的I ...

  3. 第1节 kafka消息队列:11、kafka的数据不丢失机制,以及kafka-manager监控工具的使用;12、课程总结

    12.kafka如何保证数据的不丢失 12.1生产者如何保证数据的不丢失 kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到 如果是同步模 ...

  4. Linux centosVMware df命令、du命令、磁盘分区

    一.df命令 df(disk filesystem的简写)用于查看自己挂载磁盘的总容量.使用容量.剩余容量,可以不加任何参数,默认以KB为单位. [root@davery ~]# df文件系统 1K- ...

  5. C语言数组成绩排序

    #include<stdio.h> #define N 10 int main() { int s,i,j,tmp; int a[10]={78,56,38,99,81,86,39,100 ...

  6. java递归调用 return的问题

    最近比较闲,写了个递归调用获取最大公约数,刚开始写错了,但一直不明白错在哪,错误代码如下: public class Demo { public static void main(String[] a ...

  7. 099、Java中String类之字符数组与字符串的转换

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. Python dir和vars的区别

    dir()和vars()的区别就是 dir()只打印属性(属性,属性......) 而vars()则打印属性与属性的值(属性:属性值......) ex. >> a='aaaaaaaaaa ...

  9. Ubuntu基于Apache为自己的网站开启HTTPS

    暂时放这里链接,之后整理 https://www.deanhan.cn/ubuntu-apache-https.html

  10. vue 线上,本地,不同变量配置

    线上的接口和本地的接口不一样,每次打包的时候要手动更改很麻烦.自动让他配置 1.修改package.json  --mode line 传参数line给配置项,编译buildline的时候,就能把li ...