posts - 16,comments - 17,trackbacks - 0

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

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

              整個實現過程可以分為五步來完成:

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

          package example;

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

              
              
          public native String getNameCPP();
          }


          2) 使用javah產生對應的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)實現對應的CPP代碼:
          #include "example_TestJNI.h"
          #include 
          <string>

          JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
            (JNIEnv 
          * env, jobject)
          {
              
          //TODO 可以在此調用其他的代碼
              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)執行
          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 非飛 閱讀(3358) 評論(0)  編輯  收藏 所屬分類: JAVA 相關技術
          主站蜘蛛池模板: 诸暨市| 崇阳县| 吴忠市| 临清市| 嘉兴市| 贡觉县| 军事| 郸城县| 固安县| 佛冈县| 吉隆县| 彩票| 司法| 游戏| 满城县| 安新县| 牡丹江市| 宜兴市| 海兴县| 中西区| 土默特左旗| 阿瓦提县| 武夷山市| 锦州市| 突泉县| 天津市| 东方市| 樟树市| 申扎县| 浦江县| 贡山| 怀集县| 元朗区| 勃利县| 金川县| 平泉县| 方山县| 海安县| 余江县| 渑池县| 昂仁县|