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]); } } } }}
/* 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 __cplusplusextern "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
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;}