1.在java里创建一个类,在类里添加静态方法调用c++的类库dll,在java里创建要返回数组的函数。在java的main方法里创建返回后的测试方法。

  1. package cn.gov.cma.cnn.webgis.active;
  2. public class TestHello {
  3. //调用c++的动态库
  4. static {
  5. System.loadLibrary("TempComponent");
  6. }
  7. //返回int类型的数组
  8. public static native float[][][] linefloat(String msg,String msg2);
  9. public static void main(String[] args) {
  10. //三维float数组测试
  11. float[][][] liness=linefloat("111","222") ;
  12. System.out.println("等值线的数量是:"+liness.length);
  13. for (int j=0;j<liness.length;j++)
  14. {
  15. float[][] lines =liness[j];
  16. System.out.println("第"+j+"个线:");
  17. System.out.println("第"+j+"个线里点的个数是:"+lines.length);
  18. for(int k=0;k<lines.length;k++)
  19. {
  20. float[] line =lines[k];
  21. System.out.println("第"+j+"个线:里有"+line.length+"个点");
  22. for(int m=0;m<line.length;m++)
  23. {
  24. System.out.println("第"+m+"个点:的坐标是:"+line[m]);
  25. }
  26. }
  27. }
  28. }
  29. }

2.等java代码编译之后生成class文件之后,调用javah方法编译成c++的头文件,编译时需要注意如果java类在一个包下面,需要带上包名称如:cn.gov.cma.cnn.webgis.active.TestHello,并且先用cd命令进入包外面的文件夹里编译,即在class文件下编译。



编译之后在clss下生成:cn_gov_cma_cnn_webgis_active_TestHello.h文件,

内容是:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class cn_gov_cma_cnn_webgis_active_TestHello */
  4. #ifndef _Included_cn_gov_cma_cnn_webgis_active_TestHello
  5. #define _Included_cn_gov_cma_cnn_webgis_active_TestHello
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     cn_gov_cma_cnn_webgis_active_TestHello
  11. * Method:    linefloat
  12. * Signature: (Ljava/lang/String;Ljava/lang/String;)[[[F
  13. */
  14. JNIEXPORT jobjectArray JNICALL Java_cn_gov_cma_cnn_webgis_active_TestHello_linefloat
  15. (JNIEnv *, jclass, jstring, jstring);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

3.把类生成的头文件需要的函数考到c++里面,实现它,然后编译成dll,名字和java静态库里调用的一样我的是:TempComponent.dll

  1. JNIEXPORT jobjectArray JNICALL Java_cn_gov_cma_cnn_webgis_active_TestHello_linefloat(JNIEnv *env, jclass cls, jstring jMsg2, jstring jMsg3)
  2. {
  3. //获得二维数组的类
  4. jclass intArrCls2 = env->FindClass("[[F");
  5. //实例化数组对象,第一个参数数据的大小,第二个参数用来实例化用
  6. //的类是一个二维数组,也就是数组里的每个元素都是一个二维数组,
  7. //这样one就是一个三维数组。
  8. jobjectArray one = env->NewObjectArray(2, intArrCls2, NULL);
  9. for(int k=0;k<2;k++)
  10. {
  11. //一维数组
  12. jclass intArrCls = env->FindClass("[F");
  13. //创建一个有10个元素,每个元素的值是  一维数组的数组
  14. jobjectArray second = env->NewObjectArray(10, intArrCls, NULL);
  15. //给以维数据填充值
  16. for (int i = 0; i < 10; i++) {
  17. jfloat tmp[256]; /* make sure it is large enough! */
  18. jfloatArray iarr = env->NewFloatArray(3);
  19. tmp[0] = 21.0;
  20. tmp[1] = 31.0;
  21. tmp[2] = 41.0;
  22. //把temp里的0-3的数据值设置给iarr里
  23. env->SetFloatArrayRegion(iarr, 0, 3, tmp);
  24. //给一维数组的第i个元素设置值
  25. env->SetObjectArrayElement(second, i, iarr);
  26. //删除临时元素iarr数组
  27. env->DeleteLocalRef(iarr);
  28. }
  29. //给三维数组里的每个元素设置值,值是一个有一个元素组成的二维数据,每个元素是一个由三个浮点小数组成的三维数组
  30. env->SetObjectArrayElement(one, k, second);
  31. //删除临时元素二维数组
  32. env->DeleteLocalRef(second);
  33. }
  34. return one;
  35. }

4.然后用java
cn.gov.cma.cnn.webgis.active.TestHello去运行试试,呵呵,好了。如果想直接用eclipse运行需要把c++生成的dll文件拷贝到tomacat的bin目录下,然后也就可以了,或者配置在环境变量让程序可以找到这个dll。这个方法应该可以我没试。

jni java与c++交互返回三维数组jobjectArray的更多相关文章

  1. java读取目录下所有csv文件数据,存入三维数组并返回

    package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...

  2. Jni :三维数组处理方法 ,以整形三维数组为例 C++实现

    本文原创,转载请注明地址:http://www.cnblogs.com/baokang/p/4982846.html 关于Jni的基本使用方法,请参阅:Java 调用 C++ (Java 调用 dll ...

  3. Java数组的应用:案例:杨辉三角,三维数组,字符串数组

    //import java.util.Arrays; //包含Arrays //import java.util.Random; public class HelloWorld { public st ...

  4. Java 一维数组 二维数组 三维数组

    二维数组包含一位数组  三维数组就是在二维数组的基础上,再加一层.把二维数组看做是一维数组就可以了,按照上述理解类推.   下面是 一维 二维 三维数组例子   一维数组: int[] array1 ...

  5. Android WebView加载本地html并实现Java与JS交互

    最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...

  6. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  7. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果

    package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

  8. Java编程思想学习(十二) 数组和容器

    一.数组 1).数组的多种初始化方式 下面总结了初始化数组的多种方式,以及如何对指向数组的引用赋值,使其指向另一个数组对象.值得注意的是:对象数组和普通数组的各种操作基本上都是一样的:要说有什么不同的 ...

  9. java如何从方法返回多个值

    本文介绍三个方法,使java方法返回多个值. 方法1:使用集合类 方法2:使用封装对象 方法3:使用引用传递 示例代码如下: import java.util.HashMap; import java ...

随机推荐

  1. 51 nod 1693 水群

    1693 水群 基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160  难度:6级算法题  收藏  关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有 ...

  2. HDU 4334 Contest 4

    本来以为是一道水题,好吧,做了才知道,出题的人有多牛.二分搜索是不可能的了,因为会超内存... 看到别人的搜索两个集合的提示,我就自己一边去想了.终于想出来了: 可以这样做,先把每两个集合的和值枚举出 ...

  3. 零基础学HTML 5实战开发(第一季)

    開始学习html5了.趋势不得不学习啊,之前老毛说过落后就要挨打,如今是不学习就要被市场淘汰,被社会淘汰.喜欢挑战,喜欢冒险.来吧.csdn给我们提供了那么好的平台.用起来..零基础学HTML 5的实 ...

  4. srw阅读笔记

    第一章 p11,不要使用we来代表普遍意义上的人们,使用形式主语和被动语态

  5. windows+ubuntu双系统,在windows中访问ubuntu文件

    今天被告知ubuntu磁盘空间不足,百度得知可以通过autoremove命令清理,然而,,再也进不去ubuntu系统了,具体表现为第一次选择ubuntu之后一直是空白紫屏,如果强制关机再开机后选择ub ...

  6. matplotlib 可视化 —— matplotlib.patches

    官方帮助文档 patches - Matplotlib 1.5.1 documentation patches 下主要包含的常用图形类有: Eclipse Circle Wedge 1. plt.gc ...

  7. Nashorn——在JDK 8中融合Java与JavaScript之力--转

    原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性 ...

  8. sql server 去掉某字段左边的0

    比如:将以下Code字段 Code 000 001 002 ... 009 010 依次去掉左边的0,000替换为0,001替换为1,010替换为10,以此类推 Code 0 1 2 ... 9 10 ...

  9. Sublime Text 3 注册码 激活码 版本号 Build 3143

    —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...

  10. Nginx——在Windows环境下安装(一)

    下载 Nginx是开源软件,用户可以访问 http://nginx.org/ 网站获取源码包或Windows二进制文件下载.其中1.13.x版本为开发版本,1.12.0版本为稳定版本.开发版本分支会较 ...