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 非飛 閱讀(3357) 評論(0)  編輯  收藏 所屬分類: JAVA 相關技術
          主站蜘蛛池模板: 隆回县| 湘西| 桦甸市| 嘉荫县| 莱阳市| 巍山| 丹凤县| 新巴尔虎左旗| 南京市| 秀山| 忻州市| 通许县| 陆丰市| 长顺县| 杭锦旗| 呼伦贝尔市| 美姑县| 万源市| 安化县| 岱山县| 中牟县| 乌兰察布市| 金溪县| 兴城市| 井陉县| 衡阳市| 南安市| 乌兰县| 资源县| 深州市| 隆安县| 彰化县| 沐川县| 土默特左旗| 大竹县| 买车| 建平县| 屏南县| 洞口县| 芦山县| 凭祥市|