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

[size=large][b]jni java与c++交互返回三维数组jobjectArray [/b][/size]

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文件下编译。
[img]http://dl.iteye.com/upload/attachment/601829/381d90a0-3923-3476-bebe-3e73aff48cba.png[/img]
编译之后在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。这个方法应该可以我没试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值