`
fengzheng0603
  • 浏览: 72942 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

jni java与c++交互返回三维数组jobjectArray

阅读更多
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。这个方法应该可以我没试。
  • 大小: 4.3 KB
分享到:
评论

相关推荐

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    在Java编程中,有时我们需要与C++...总之,JNA提供了灵活的方式让Java与C++库进行交互,但在处理复杂数据类型如二维数组时需要注意内存布局和数据转换。在实际项目中,应确保充分测试,保证在不同平台上都能正确运行。

    C++库封装JNI接口-实现java调用c++

    JNI是一套接口,它定义了Java虚拟机(JVM)如何与本地代码(如C++)通信。Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建...

    jni返回对象数组例子

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层...

    java与c++交互(JNI学习笔记)

    ### Java与C++交互(JNI学习笔记) #### 一、Java类型与C/C++类型对应关系 在Java Native Interface (JNI) 中,Java 和 C/C++ 的数据类型有着明确的对应关系。理解这些对应关系是实现Java与C++交互的基础。 - **...

    jni传递对象数组

    在C/C++层,我们实现这个本地方法,并通过JNI接口与Java对象进行交互。对象数组的处理涉及到对Java虚拟机(JVM)的内存管理和类型转换的理解。 1. **创建本地方法** 在Java类中,我们可以声明一个本地方法,使用`...

    Qt for Android 用JNI来使C++和Java互调(目前最新版全网只有这个可用)

    "Qt for Android 用JNI来使C++和Java互调"的主题揭示了如何利用JNI(Java Native Interface)技术在Qt与Android原生系统之间建立桥梁,实现两者的交互。以下将详细介绍这一过程。 首先,Qt for Android是Qt项目的一...

    JNI:Java与C++的美好结合 视频地址

    在这个视频课程中,讲师会深入探讨如何通过JNI实现Java与C++的有效结合,特别关注代码的稳定性和设计优化。 首先,课程的目标之一是避免在C层的全局变量中存储Java或C++对象的引用。全局变量在程序的整个生命周期内...

    Java采用JNI调用VC++生成的dll(Java与C++交互)

    JNI是Java平台的一部分,它的主要作用是提供了一种机制,使得Java代码能够与本地(非Java)代码进行交互,包括C++、C或其他本地语言。JNI允许开发者在Java应用程序中直接调用C/C++函数,从而实现了Java与本地代码的...

    JNI_JAVA_C++.zip

    - **JNI_Project_c++工程.zip**:这是一个C++项目,包含JNI相关的源码,实现了与Java的交互。可能包括头文件(.h)定义了JNI函数原型,C++源文件(.cpp)实现了这些函数,以及构建脚本(如Android.mk或CMakeLists....

    jni java类与c++类映射的例子

    综上所述,JNI是Java与C++交互的重要桥梁。通过理解JNI的工作原理,以及如何映射Java类和C++类,我们可以有效地在两种语言之间进行数据交换和方法调用,实现混合编程的优势。在实际项目中,这常用于图形渲染、高性能...

    Java使用jni接口调用C++动态库.docx

    Java 通过使用 JNI(Java Native Interface)接口可以调用 C++ 动态库,该技术可以大大扩展 Java 的能力,让 Java 应用程序可以与其他语言编写的程序进行交互。下面是 Java 使用 JNI 接口调用 C++ 动态库的详细步骤...

    利用JNI实现Java调用C++库

    利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)

    Android的jni的应用C,C++(基本类型,数组,类(结构体)).源码

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他编程语言,尤其是C和C++进行交互。JNI对于那些需要利用C/C++库性能或需要访问硬件特性的Android开发者来说尤其重要。这篇关于...

    用JNI实现java和C++的相互调用

    在Java编程环境中,有时我们需要利用C或C++的高性能特性,这时可以借助Java Native Interface (JNI) 进行Java和C++之间的交互调用。JNI允许Java代码调用本地(非Java)代码,并且反之亦然。下面我们将详细介绍如何用...

    头部姿态估计(HeadPose Estimation)-Android源码-使用Jni技术将java与c++交互

    头部姿态估计(HeadPose Estimation)-Android源码-使用Jni技术将java与c++交互

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    08_15_JNI_03_方法访问_数组处理&jni引用

    08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_...

    Android-JNI完整工程,实现c++调用java和java调用c++

    这个完整工程展示了如何在Android应用中使用JNI,实现C++与Java之间的双向调用。这种技术在需要高效计算、利用硬件加速或者复用已有的C/C++库时非常有用。 1. **JNI基础知识**: - JNI接口提供了Java虚拟机(JVM)...

    JNI学习三-简单类型数组访问

    要在本地代码中访问这些数组,你需要先获取`JNIEnv`指针,这是JNI的核心,它包含了所有与Java虚拟机交互的函数。 ```java public native void processIntArray(int[] arr); ``` 在对应的C/C++代码中,你需要使用`...

Global site tag (gtag.js) - Google Analytics