之前的文章讲解了有关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语言的核心知识点指针,各种操作水到渠成。

最新文章

  1. nginx相关的一些记录
  2. CentOS7网络配置
  3. Homework
  4. 黑马程序员:Java编程_异常
  5. 建造模式Builder
  6. 欧拉路径Hrbust1351
  7. Unity5 Screen-Space Subsurface Scattering屏幕空间次表面散射SSSSS
  8. 让浏览器支持 jquery ajax load 前进、后退 功能
  9. ngx-push-stream模块源码学习(一)——序言
  10. 【ubuntu】开机启动
  11. 【css】css3属性
  12. 201521123059 《Java程序设计》第八周学习总结
  13. docker环境下使用xdebug进行断点调试
  14. CentOS 7.0下安装Python3.6
  15. Numpy数组的保存与读取
  16. Tour HDU - 3488 有向环最小权值覆盖 费用流
  17. s21day09 python笔记
  18. JAVA AES加密解密
  19. 〖Linux〗Kubuntu KDE开机后总是提示“system program problem detected”的解决方法
  20. Android 基础题目

热门文章

  1. JuJu Beta Postmortem
  2. 在 Mac/Windows 系统中使用 Laradock 搭建基于 Docker 的 Laravel 开发环境 (改)
  3. java并发初探ReentrantWriteReadLock
  4. Xshell 5的快捷键
  5. 第1节 storm编程:4、storm环境安装以及storm编程模型介绍
  6. [Android]ListView中分割线的设置
  7. [Tommas] ERP系统测试用例设计1(转)
  8. JDBC--处理事务
  9. Day3-G - Task HDU4864
  10. 写的一个轻量级javascript框架的设计模式