之前的文章讲解了有关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. python中时间戳的探索

    声明 本文章只针对python3.6及以上版本. 问题提出 首先,我们先import一些必要模块: In [1]: from datetime import datetime, timezone, t ...

  2. Kafka源码系列之源码分析zookeeper在kafka的作用

    浪尖的kafka源码系列以kafka0.8.2.2源码为例给大家进行讲解的.纯属个人爱好,希望大家对不足之处批评指正. 一,zookeeper在分布式集群的作用 1,数据发布与订阅(配置中心) 发布与 ...

  3. HashMap ( Java 8)

    HashTable是早起java提供的基于hash表的实现,不允许存放null键和值,是同步的,影响开销,不太被推荐. HashMap行为上和HashTable差不多,不是同步的,允许键和值为null ...

  4. 多个span标签在同一行显示

    属性设置为display:inline或display:inline-block

  5. ADV-297 快速排序 java

    问题描述 用递归来实现快速排序(quick sort)算法.快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x.首先对数组中的元素进行调整,使x放在正确的位置上.同时,所有比x小 ...

  6. java反射初探

    java反射 反射是java的重要特性之一,java.lang.reflect 是jdk支持反射的重要包,我下面可能会对构造器Constructor,属性Filed,方法Method会用到.反射其实很 ...

  7. Android_实验小心得_持续补充中......

    1.LineLayout布局控件宽度百分比显示 其中,宽度百分比 = 控件权重 / 所在parent中所有控件权重和 <LinearLayout android:layout_width=&qu ...

  8. day12-Python运维开发基础(推导式、生成器与生成器函数)

    1. 推导式(列表推导式.集合推导式.字典推导式) # ### 推导式 : 通过一行循环判断,遍历出一系列数据的方式是推导式 """ 推导式一共三种: 列表推导式,集合推 ...

  9. SpringMVC controller中业务方法的参数、返回值

    业务方法的参数 业务方法的参数类型.参数个数是任意的,根据需要使用. 常见的参数类型: HttpServletRequest.HttpServletResponse.HttpSession    获取 ...

  10. 「牛客CSP-S2019赛前集训营2」服务器需求

    传送门 NowCoder 解题思路 考虑一种贪心选择方法:每次选出最大的 \(m\) 个 \(a_i\) 进行覆盖. 那么就会出现一种特殊情况,最高的那个 \(a_i\) 需要多次选择,而且不得不每次 ...