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文件下编译。
jni java与c++交互返回三维数组jobjectArray
编译之后在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。这个方法应该可以我没试。

你可能感兴趣的:(java调用c++,jni三维数组调用)