jni java与c++交互返回三维数组jobjectArray
1.在java里创建一个类,在类里添加静态方法调用c++的类库dll,在java里创建要返回数组的函数。在java的main方法里创建返回后的测试方法。
- package cn.gov.cma.cnn.webgis.active;
- public class TestHello {
- //调用c++的动态库
- static {
- System.loadLibrary("TempComponent");
- }
- //返回int类型的数组
- public static native float[][][] linefloat(String msg,String msg2);
- public static void main(String[] args) {
- //三维float数组测试
- float[][][] liness=linefloat("111","222") ;
- System.out.println("等值线的数量是:"+liness.length);
- for (int j=0;j<liness.length;j++)
- {
- float[][] lines =liness[j];
- System.out.println("第"+j+"个线:");
- System.out.println("第"+j+"个线里点的个数是:"+lines.length);
- for(int k=0;k<lines.length;k++)
- {
- float[] line =lines[k];
- System.out.println("第"+j+"个线:里有"+line.length+"个点");
- for(int m=0;m<line.length;m++)
- {
- System.out.println("第"+m+"个点:的坐标是:"+line[m]);
- }
- }
- }
- }
- }
2.等java代码编译之后生成class文件之后,调用javah方法编译成c++的头文件,编译时需要注意如果java类在一个包下面,需要带上包名称如:cn.gov.cma.cnn.webgis.active.TestHello,并且先用cd命令进入包外面的文件夹里编译,即在class文件下编译。

编译之后在clss下生成:cn_gov_cma_cnn_webgis_active_TestHello.h文件,
内容是:
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class cn_gov_cma_cnn_webgis_active_TestHello */
- #ifndef _Included_cn_gov_cma_cnn_webgis_active_TestHello
- #define _Included_cn_gov_cma_cnn_webgis_active_TestHello
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: cn_gov_cma_cnn_webgis_active_TestHello
- * Method: linefloat
- * Signature: (Ljava/lang/String;Ljava/lang/String;)[[[F
- */
- JNIEXPORT jobjectArray JNICALL Java_cn_gov_cma_cnn_webgis_active_TestHello_linefloat
- (JNIEnv *, jclass, jstring, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif
3.把类生成的头文件需要的函数考到c++里面,实现它,然后编译成dll,名字和java静态库里调用的一样我的是:TempComponent.dll
- JNIEXPORT jobjectArray JNICALL Java_cn_gov_cma_cnn_webgis_active_TestHello_linefloat(JNIEnv *env, jclass cls, jstring jMsg2, jstring jMsg3)
- {
- //获得二维数组的类
- jclass intArrCls2 = env->FindClass("[[F");
- //实例化数组对象,第一个参数数据的大小,第二个参数用来实例化用
- //的类是一个二维数组,也就是数组里的每个元素都是一个二维数组,
- //这样one就是一个三维数组。
- jobjectArray one = env->NewObjectArray(2, intArrCls2, NULL);
- for(int k=0;k<2;k++)
- {
- //一维数组
- jclass intArrCls = env->FindClass("[F");
- //创建一个有10个元素,每个元素的值是 一维数组的数组
- jobjectArray second = env->NewObjectArray(10, intArrCls, NULL);
- //给以维数据填充值
- for (int i = 0; i < 10; i++) {
- jfloat tmp[256]; /* make sure it is large enough! */
- jfloatArray iarr = env->NewFloatArray(3);
- tmp[0] = 21.0;
- tmp[1] = 31.0;
- tmp[2] = 41.0;
- //把temp里的0-3的数据值设置给iarr里
- env->SetFloatArrayRegion(iarr, 0, 3, tmp);
- //给一维数组的第i个元素设置值
- env->SetObjectArrayElement(second, i, iarr);
- //删除临时元素iarr数组
- env->DeleteLocalRef(iarr);
- }
- //给三维数组里的每个元素设置值,值是一个有一个元素组成的二维数据,每个元素是一个由三个浮点小数组成的三维数组
- env->SetObjectArrayElement(one, k, second);
- //删除临时元素二维数组
- env->DeleteLocalRef(second);
- }
- return one;
- }
4.然后用java
cn.gov.cma.cnn.webgis.active.TestHello去运行试试,呵呵,好了。如果想直接用eclipse运行需要把c++生成的dll文件拷贝到tomacat的bin目录下,然后也就可以了,或者配置在环境变量让程序可以找到这个dll。这个方法应该可以我没试。
jni java与c++交互返回三维数组jobjectArray的更多相关文章
- java读取目录下所有csv文件数据,存入三维数组并返回
package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...
- Jni :三维数组处理方法 ,以整形三维数组为例 C++实现
本文原创,转载请注明地址:http://www.cnblogs.com/baokang/p/4982846.html 关于Jni的基本使用方法,请参阅:Java 调用 C++ (Java 调用 dll ...
- Java数组的应用:案例:杨辉三角,三维数组,字符串数组
//import java.util.Arrays; //包含Arrays //import java.util.Random; public class HelloWorld { public st ...
- Java 一维数组 二维数组 三维数组
二维数组包含一位数组 三维数组就是在二维数组的基础上,再加一层.把二维数组看做是一维数组就可以了,按照上述理解类推. 下面是 一维 二维 三维数组例子 一维数组: int[] array1 ...
- Android WebView加载本地html并实现Java与JS交互
最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...
- Java编程思想学习(十二) 数组和容器
一.数组 1).数组的多种初始化方式 下面总结了初始化数组的多种方式,以及如何对指向数组的引用赋值,使其指向另一个数组对象.值得注意的是:对象数组和普通数组的各种操作基本上都是一样的:要说有什么不同的 ...
- java如何从方法返回多个值
本文介绍三个方法,使java方法返回多个值. 方法1:使用集合类 方法2:使用封装对象 方法3:使用引用传递 示例代码如下: import java.util.HashMap; import java ...
随机推荐
- [debug]重定义默认參数
编敲代码过程中遇到重定义默认參数的错误,例如以下例所看到的: #include<iostream> #include<stdlib.h> using namespace std ...
- Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
在正常使用应用的过程中.前台的activity在一些时候会被其它的组件遮挡,导致这个activity暂停.举个样例.当一个半透明的activity被打开(比如一个dialog样式的activity), ...
- [JZOJ 5894] [NOIP2018模拟10.5] 同余方程 解题报告(容斥)
题目链接: http://172.16.0.132/senior/#contest/show/2523/0 题目: 题解:(部分内容来自https://blog.csdn.net/gmh77/arti ...
- [JZOJ 100026] [NOIP2017提高A组模拟7.7] 图 解题报告 (倍增)
题目链接: http://172.16.0.132/senior/#main/show/100026 题目: 有一个$n$个点$n$条边的有向图,每条边为$<i,f(i),w(i)>$,意 ...
- HTML5学习笔记(二):用于构建页面的语义元素
1.语义元素 大多数HTML5语义元素的用途是标识页面中的一个内容区块,为标注的内容赋予额外的含义,不真正做任何事. 2.使用语义元素的原因 容易修改和维护: 无障碍性(现代Web设计的一个重要主题) ...
- xBIM 实战02 在浏览器中加载IFC模型文件并设置特效
系列目录 [已更新最新开发文章,点击查看详细] 在模型浏览器中加载模型后,可以对模型做一些特殊操作.下图是常用的设置. 都是通过 xbim-viewer.js 中的 API 来设置以达到一定的 ...
- Android eclipse 运行项目设置程序默认安装到SD卡
Android eclipse 运行项目设置程序默认安装到SD卡 1.在Android手机启用USB调试功能 2.在Windows系统中打开命令提示符(开始菜单,选择运行,输入cmd回车即可),使用 ...
- APACHE KYLIN™ 概览(分布式分析引擎)
Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区.它能 ...
- 优动漫PAINT-紫藤花画法
本教程分享一篇使用优动漫PAINT绘制一树梦幻的紫藤萝花教程,原文转载自优动漫官网. 小清新紫藤萝教程,就到这里啦!有兴趣的可以尝试画一画哦,软件下载:www.dongmansoft.com/xiaz ...
- 马云谈AI:未来10-15年传统制造业的痛苦将远超今天的想象
马云谈AI:未来10-15年传统制造业的痛苦将远超今天的想象 “未来10到15年,传统制造业面临的痛苦将会远远超过今天的想象,企业如果不能从规模化.标准化向个性化和智慧化转型,将很难生存下去.” 9月 ...