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


    1.在java里创建一个类,在类里添加静态方法调用c++的类库dll,在java里创建要返回数组的函数。在java的main方法里创建返回后的测试方法。

    Java代码  收藏代码
    1. package cn.gov.cma.cnn.webgis.active;  
    2.   
    3.   
    4. public class TestHello {  
    5.   
    6.       //调用c++的动态库  
    7.       static {  
    8.             System.loadLibrary("TempComponent");           
    9.       }  
    10.   
    11.         
    12.       //返回int类型的数组  
    13.       public static native float[][][] linefloat(String msg,String msg2);       
    14.     
    15.         
    16.       public static void main(String[] args) {  
    17.   
    18.          //三维float数组测试  
    19.          float[][][] liness=linefloat("111","222") ;  
    20.          System.out.println("等值线的数量是:"+liness.length);            
    21.          for (int j=0;j<liness.length;j++)  
    22.          {  
    23.              float[][] lines =liness[j];  
    24.              System.out.println("第"+j+"个线:");  
    25.              System.out.println("第"+j+"个线里点的个数是:"+lines.length);  
    26.              for(int k=0;k<lines.length;k++)  
    27.              {  
    28.                  float[] line =lines[k];  
    29.                  System.out.println("第"+j+"个线:里有"+line.length+"个点");   
    30.                  for(int m=0;m<line.length;m++)  
    31.                  {  
    32.                      System.out.println("第"+m+"个点:的坐标是:"+line[m]);   
    33.                  }  
    34.              }  
    35.          }  
    36.       }  
    37.   
    38.   
    39. }  



    2.等java代码编译之后生成class文件之后,调用javah方法编译成c++的头文件,编译时需要注意如果java类在一个包下面,需要带上包名称如:cn.gov.cma.cnn.webgis.active.TestHello,并且先用cd命令进入包外面的文件夹里编译,即在class文件下编译。

    编译之后在clss下生成:cn_gov_cma_cnn_webgis_active_TestHello.h文件,
    内容是:

    C++代码  收藏代码
    1. /* DO NOT EDIT THIS FILE - it is machine generated */  
    2. #include <jni.h>  
    3. /* Header for class cn_gov_cma_cnn_webgis_active_TestHello */  
    4.   
    5. #ifndef _Included_cn_gov_cma_cnn_webgis_active_TestHello  
    6. #define _Included_cn_gov_cma_cnn_webgis_active_TestHello  
    7. #ifdef __cplusplus  
    8. extern "C" {  
    9. #endif  
    10. /* 
    11.  * Class:     cn_gov_cma_cnn_webgis_active_TestHello 
    12.  * Method:    linefloat 
    13.  * Signature: (Ljava/lang/String;Ljava/lang/String;)[[[F 
    14.  */  
    15. JNIEXPORT jobjectArray JNICALL Java_cn_gov_cma_cnn_webgis_active_TestHello_linefloat  
    16.   (JNIEnv *, jclass, jstring, jstring);  
    17.   
    18. #ifdef __cplusplus  
    19. }  
    20. #endif  
    21. #endif  


    3.把类生成的头文件需要的函数考到c++里面,实现它,然后编译成dll,名字和java静态库里调用的一样我的是:TempComponent.dll

    C++代码  收藏代码
    1. JNIEXPORT jobjectArray JNICALL Java_cn_gov_cma_cnn_webgis_active_TestHello_linefloat(JNIEnv *env, jclass cls, jstring jMsg2, jstring jMsg3)  
    2. {  
    3.     //获得二维数组的类  
    4.     jclass intArrCls2 = env->FindClass("[[F");          
    5.     
    6.     //实例化数组对象,第一个参数数据的大小,第二个参数用来实例化用  
    7.     //的类是一个二维数组,也就是数组里的每个元素都是一个二维数组,  
    8.     //这样one就是一个三维数组。  
    9.     jobjectArray one = env->NewObjectArray(2, intArrCls2, NULL);  
    10.   
    11.     for(int k=0;k<2;k++)  
    12.     {  
    13.         //一维数组  
    14.         jclass intArrCls = env->FindClass("[F");  
    15.         //创建一个有10个元素,每个元素的值是  一维数组的数组  
    16.         jobjectArray second = env->NewObjectArray(10, intArrCls, NULL);  
    17.   
    18.         //给以维数据填充值  
    19.         for (int i = 0; i < 10; i++) {  
    20.   
    21.             jfloat tmp[256]; /* make sure it is large enough! */  
    22.   
    23.             jfloatArray iarr = env->NewFloatArray(3);  
    24.   
    25.             tmp[0] = 21.0;  
    26.             tmp[1] = 31.0;  
    27.             tmp[2] = 41.0;  
    28.   
    29.             //把temp里的0-3的数据值设置给iarr里  
    30.             env->SetFloatArrayRegion(iarr, 0, 3, tmp);  
    31.             //给一维数组的第i个元素设置值  
    32.             env->SetObjectArrayElement(second, i, iarr);  
    33.             //删除临时元素iarr数组  
    34.             env->DeleteLocalRef(iarr);  
    35.   
    36.         }  
    37.             //给三维数组里的每个元素设置值,值是一个有一个元素组成的二维数据,每个元素是一个由三个浮点小数组成的三维数组  
    38.             env->SetObjectArrayElement(one, k, second);  
    39.             //删除临时元素二维数组  
    40.             env->DeleteLocalRef(second);  
    41.     }  
    42.     return one;  
    43. }  



    4.然后用java cn.gov.cma.cnn.webgis.active.TestHello去运行试试,呵呵,好了。如果想直接用eclipse运行需要把c++生成的dll文件拷贝到tomacat的bin目录下,然后也就可以了,或者配置在环境变量让程序可以找到这个dll。这个方法应该可以我没试。

  • 相关阅读:
    (重要)1
    大数据技术
    条件随机场之CRF++源码详解-预测
    条件随机场之CRF++源码详解-训练
    条件随机场之CRF++源码详解-特征
    条件随机场之CRF++源码详解-开篇
    这个更新需要花去 50.6 M 磁盘上总计 /boot 的空间。请在 7737k 磁盘上留出 /boot 空间。清空您的回收站和临时文件,用“sudo apt-get clean
    多线程:pthread_exit,pthread_join,pthread_self
    error: ‘for’ loop initial declarations are only allowed in
    多线程
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6840209.html
Copyright © 2020-2023  润新知