之前的文章讲解了有关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. redis之五大数据类型介绍

    目录 redis五大数据类型 1. string(字符串) 特点: 格式: 基本操作: 2. hash(哈希) 特点: 格式: 基本操作 3. list(列表) 特点 格式 基本操作 4. set(集 ...

  2. SQL注入个人理解及思路(包括payload和绕过的一些方式)

    首先本文主要是把我对SQL注入的一些坑和最早学习SQL注入的时候的一些不理解的地方做一个梳理. (本文仅为个人的一点皮毛理解,如有错误还望指出,转载请说明出处,大佬勿喷=.=) 什么是SQL注入呢? ...

  3. python学习第二课——while循环

    #while循环基础语句 while 1==1: print('OK') #死循环 #如何阻止死循环 count=0 while count<10: print('第'+(str)(count) ...

  4. ROS学习笔记6-理解主题

    本文来源于:http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics ROS主题假设turtlesim节点已经运行,打开一个新终端,使用如下命令运行键 ...

  5. 三、js提交请求加载启动动画、请求完成成功回调、注销加载动画

    1.通过Query  post方式进行异步请求方法 jQuery.post(url, [data], [callback], [type]) 参数说明: url:发送请求地址 data:待发送 Key ...

  6. Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件

    一.管道符和作业控制 管道符|,用于将前一个指令的输出作为后一个指令的输入 #cat /etc/passwd|wc -l  作业控制:当运行程序时,可以使它暂停(Ctrl+Z组合键),然后使用fg(f ...

  7. Outer()函数

    转载:https://bbs.pinggu.org/thread-7078237-1-1.html R语言中的outer()函数,名为内积函数,但是他执行的功能并不是解析几何中的内积.那该函数到底发挥 ...

  8. mysql多实例双主部署

    本文引自公司技术文档,仅作为记录. 背景 有的时候需要进行数据库环境的隔离,以及节省服务器资源一台mysql安装多个数据库实例,一个实例下构建多个数据库​ 安装mysql yum -y install ...

  9. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'解决

    用XAMPP装装好mysql之后,mysql -uroot 连不上,报这个错误:   ERROR 2002 (HY000): Can't connect to local MySQL server t ...

  10. 原型与继承与class

    对象有属性(专业点叫静态属性)和方法(专业点叫静态方法)和原型属性和原型方法 除了系统自带的那么几百万个对象,我们自己写在js的创建的对象,自定义的对象,都来自对象的构造函数,用来构造对象的函数,叫做 ...