JNI操作二维数组
之前的文章讲解了有关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操作二维数组的更多相关文章
- PHP操作 二维数组模拟mysql函数
PHP操作 二维数组模拟mysql函数<pre>public function monimysqltest(){ $testarray=array( array('ss'=>'1', ...
- c语言中如何通过二级指针来操作二维数组
通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上.之后就可以通过二维指针直接访问了. 参考代码如下,可以看具体注释辅 ...
- C语言笔记(二维数组与数值指针)
一.关于二维数组和二维数组区别 (1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的.所以从内存的角度来分析,一维数组和二维数组其实没有本质区别. (2) 二维数组可以使用一维数 ...
- android JNI 一维数组、二维数组的访问与使用
在JNI中访问JAVA类中的整型.浮点型.字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj) ...
- php对二维数组进行相关操作(排序、转换、去空白等)
php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04 这篇文章主要介绍了php对二维数组进行相关操作,包括php对 ...
- C++使用VARIANT实现二维数组的操作
C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
1.数组基础 1.什么是数组: 同一类型数据的集合,就是一个容器. 2.数组的好处: 可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式: (一 ...
- python的二维数组操作
需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...
- 对二维数组使用指针进行操作的探索(C语言)
/* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...
随机推荐
- scrapy(创建scrapy工程)报错:“ ImportError:DLL load failed:找不到指定的模块”
先要确定什么模块找不到 解决方法 windowa环境下加 ( --user) pip install -I cryptography --user
- classmethode,staticmethode
目录 classmethod: staticmethod: 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法 而使用@staticmethod或@classmethod,就可以不需要实例化 ...
- [转载]Spring下IOC容器和DI(依赖注入) @Bean及@Autowired
Spring下IOC容器和DI(依赖注入) @Bean及@Autowired自动装配 bean是什么 bean在spring中可以理解为一个对象.理解这个对象需要换一种角度,即可将spring看做一门 ...
- 如何在adapter 中调用activity的方法
如何在adapter 中调用activity的方法 2015-08-07 17:06匿名 | 浏览 808 次 iWorkjavaAndroid public class HistoryData e ...
- ubuntu最基本的软件
输入法: https://www.cnbawwwlogs.com/zlslch/p/6943318.html qq: http://www.linuxidc.com/Linux/2016-09/134 ...
- 大数据萌新的Python学习之路(二)
笔记内容: 一.模块 Python越来越被广大程序员使用,越来越火爆的原因是因为Python有非常丰富和强大标准库和第三方库,几乎可以实现你所想要实现的任何功能,并且都有相应的Python库支持,比如 ...
- Vue3中的Proxy作用在哪里?
目录 前言 Vue没有Proxy会怎么样? proxy开始 前言 在讲解Proxy之前,我们有些前置知识点是必要掌握的: Object相关静态函数 Reflect相关静态函数 简单说明知识盲点 名称 ...
- mysql产生随机数
mysql产生随机数小结一下,可以为mysql的表生成大量的随机数: 1) 产生0到10000间的随机数 SELECT RAND() * 10000; 对应产生相应的整数 SELECT ...
- Button btn = sender as Button; //创建Button对象 这句话中Sencler和as是什么。怎么使用Sender和as
ender是个object类型的变量名,通常都是事件的默认参数名,而这个变量存的是触发这个事件的控件,而as 可以理解为抽象,它把object类理的sender变量抽象成了(Button)类型.这样它 ...
- 1_01_MSSQL课程_基础入门
0. 课程安排: 课程共7天课,前两天SQL基础,后面三天Ado.Net ,最后两天数据库高级进阶学习. 1.数据库的概念 ->数据库就是数据仓库. ->DBMS:数据库管理系统.SQLS ...