posts - 16,comments - 17,trackbacks - 0

              做項目,無論是遺留產(chǎn)品的再生產(chǎn),還是對遺留產(chǎn)品的再利用,都不可避免的會出現(xiàn)一大堆的異構現(xiàn)象。解決異構通信問題是這類項目的主要問題。以前看見這種情況第一個解決方案就是Socket通信。說實在的自己實現(xiàn)Socket通信,定制通信協(xié)議,或者是實現(xiàn)已有的通信協(xié)議都是很頭痛的事情。本人有不堪回首的歷史經(jīng)歷。

              最近同樣在項目中需要去解決一個異構問題,由于時間的緊迫,以及先天的運行環(huán)境(兩個部分是運行在同一臺機器上的)。考慮到了使用JNI,結果表明JNI是完全可以勝任目前的角色的。以前沒有了解過JNI,總是以為它這不好那不好,用了用,表現(xiàn)還不錯,而且實現(xiàn)起來非常之簡單。

              整個實現(xiàn)過程可以分為五步來完成:

          1)寫一個聲明了native的Java文件:

          package example;

          public class TestJNI 
          {
              
          static 
          {
                  System.loadLibrary(
          "test"
          );
              }

              
              
          public native String getNameCPP();
          }


          2) 使用javah產(chǎn)生對應的CPP頭文件:
          命令:javah -classpath <path> -jni example.TestJNI -d <out_dir>
          生成的頭文件example_TestJNI.h如下:
          /* DO NOT EDIT THIS FILE - it is machine generated */
          #include 
          <jni.h>
          /* Header for class example_TestJNI */

          #ifndef _Included_example_TestJNI
          #define _Included_example_TestJNI
          #ifdef __cplusplus
          extern "C" {
          #endif
          /*
           * Class:     example_TestJNI
           * Method:    getNameForCPP
           * Signature: ()Ljava/lang/String;
           
          */

          JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
            (JNIEnv 
          *, jobject);

          #ifdef __cplusplus
          }

          #endif
          #endif

          3)實現(xiàn)對應的CPP代碼:
          #include "example_TestJNI.h"
          #include 
          <string>

          JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
            (JNIEnv 
          * env, jobject)
          {
              
          //TODO 可以在此調(diào)用其他的代碼
              std::string strName = "Tower";
              
          return env->NewStringUTF(strName.c_str());
          }


          4) 編譯CPP代碼
          命令:g++ -o libtest.so -shared -I<include_path> -I<java_home>/include -I<java_home>/include/linux example_TestJNI.cpp

          5)執(zhí)行
          package example;

          public class Test {
              
          public static void main(String[] args) {
                  TestJNI test 
          = new TestJNI();
                  System.
          out.println("Hello " + test.getNameForCPP());
              }

          }


          export LD_EXPORT_PATH=<so_path>
          java -cp <path> -Djava.library.path=<so_path> example.Test
          輸出:Hello Tower
          posted on 2005-03-22 18:39 非飛 閱讀(3363) 評論(0)  編輯  收藏 所屬分類: JAVA 相關技術
          主站蜘蛛池模板: 莒南县| 凤翔县| 东莞市| 南昌市| 桐梓县| 临海市| 泸州市| 龙南县| 德保县| 太原市| 都昌县| 应城市| 盐亭县| 中西区| 顺平县| 日照市| 怀宁县| 抚州市| 舒城县| 宿迁市| 肥乡县| 宣武区| 长宁县| 枣阳市| 阿尔山市| 康乐县| 九龙坡区| 广东省| 望都县| 百色市| 长汀县| 北辰区| 田林县| 斗六市| 定州市| 兴城市| 达州市| 兴义市| 黄龙县| 综艺| 祁东县|