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实现读取文件返回字节数组
java实现读取文件的内容返回字节数组 1.代码如下所示: public class FileUtil {/*** 方法功能:读取文件内容返回字节流 * @param String fname* @r ...
- java 生成缩略图并返回字节数组_关于提取后台图片数据时自动生成缩略图程序...
调用图片的页面: require_once('thumbs.php');//调用缩略图的类文件 //3 手机推荐 $nestedRows= $Download->getDownotherList ...
- java返回字符数组_JAVA语言实现随机返回字符串数组中的字符串
本文主要向大家介绍了JAVA语言实现随机返回字符串数组中的字符串,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. //随机返回字符串数组中的字符串 public static Stri ...
- Java编程思想学习(十二) 数组和容器
一.数组 1).数组的多种初始化方式 下面总结了初始化数组的多种方式,以及如何对指向数组的引用赋值,使其指向另一个数组对象.值得注意的是:对象数组和普通数组的各种操作基本上都是一样的:要说有什么不同 ...
- jni java返回数组_Android开发实践:Java层与Jni层的数组传递
Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...
- java 打印三维数组_Java基础第三天_数组
1.定义一个函数,函数功能是动态提取int[]中元素的最大值. 2.定义一个函数,从数组中查询指定的元素首次出现的位置. 3.定义函数,完成冒泡排序,大数下沉. 4.折半查找. 5.阐述 6.定义一个 ...
- android js交互 数组,Android WebView —— Java 与 JavaScript 交互总结
相比于 Native App 和 Web App,Hybrid App 凭借其迭代灵活.控制自如.多端同步的优势在应用市场上越发显得优胜,主要得力于,其将变更频繁的部分产品功能使用 H5 开发并在客户 ...
- Java黑皮书课后题第8章:*8.27(列排序)用下面的方法实现一个二维数组中的列排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵
*8.27(列排序)用下面的方法实现一个二维数组中的列排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...
- Java黑皮书课后题第8章:*8.26(行排序)用下面的方法实现一个二维数组中的行排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵
*8.26(行排序)用下面的方法实现一个二维数组中的行排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...
最新文章
- springboot集成logback日志 通用logback.xml模板详解
- 华为2018届校招技术岗笔试题及个人解答
- LeetCode 2162. 设置时间的最少代价(枚举)
- 漫画:Java如何实现热更新?
- xstream,节点属性起别名时这样的问题你遇到过吗
- 前端悬浮窗效果_web前端入门到实战:css过渡和动画解析文
- [zz]如何使用effect
- linux安装vnc4server,Ubuntu 18.04安装vnc4server
- AI 与 5G 时代,实时互联网的下一个风口是什么?
- 本地离线语音识别芯片哪家强
- linux中用c语言做一个游戏主播,当一个游戏主播需要做什么直播准备?
- php时间变时间戳,php 时间如何转换为时间戳
- 利用FreeImage对图像转格式遇到的问题一则
- 苹果开发的资源URL链接
- 编码:隐藏在计算机软硬件背后的语言(一)编码
- 小学计算机京剧脸谱教案,[热门]《戏曲脸谱》小学美术教学案例
- GAFA将改变全球半导体势力版图
- Doevent()理解
- CentOS 7下的软件安装方法总结
- 极速系列05—python批量拆分/合并PDF文档