posts - 108,comments - 56,trackbacks - 0
          JNI
                 ☆JNI
             【摘】Java 本機接口(Java Native Interface (JNI))是一個本機編程接口,它是 Java 軟件開發工具箱(Java Software Development Kit (SDK))的一部分。JNI 允許 Java 代碼使用以其它語言(譬如 C 和 C++)編寫的代碼和代碼庫。Invocation API(JNI 的一部分)可以用來將 Java 虛擬機(JVM)嵌入到本機應用程序中,從而允許程序員從本機代碼內部調用 Java 代碼。


                 ☆JNI [Java調用其他語言]運用方向【摘】
            1)希望用更低級、更快的編程語言去實現對時間有嚴格要求的代碼。

             
          2)希望從 Java 程序訪問舊代碼或代碼庫。

             
          3)需要標準 Java 類庫中不支持的依賴于平臺的特性。


                 ☆步驟【摘】
            1)編寫 Java 代碼。從編寫 Java 類開始,這些類執行三個任務:聲明將要調用的本機方法;裝入包含本機代碼的共享庫;然后調用該本機方法。

            
          2)編譯 Java 代碼。在使用 Java 類之前,必須成功地將它們編譯成字節碼。

            
          3)創建 C/C++ 頭文件。C/C++ 頭文件將聲明想要調用的本機函數說明。然后,這個頭文件與 C/C++ 函數實現(請參閱步驟 4)一起來創建共享庫(請參閱步驟 5)。

            
          4)編寫 C/C++ 代碼。這一步實現 C 或 C++ 源代碼文件中的函數。C/C++ 源文件必須包含步驟 3 中創建的頭文件。

            
          5)創建共享庫文件。從步驟 4 中創建的 C 源代碼文件來創建共享庫文件。

            
          6)運行 Java 程序。運行該代碼,并查看它是否有用。我們還將討論一些用于解決常見錯誤的技巧。


                 ☆第一步:編寫Java代碼 
          JavaCallC.java


                 ☆第二步:編譯Java代碼
          javac JavaCallC.java


                 ☆第三步:創建C頭文件
          javah jnidemo.JavaCallC
          得到頭文件如下:
          jnidemo_JavaCallC.h
            除了 Java 聲明中的一般參數以外,所有這些函數的參數表中都有一個指向 JNIEnv 和 jobject 的指針。指向 JNIEnv 的指針實際上是一個指向函數指針表的指針,這些函數提供各種用來在 C 和 C++ 中操作 Java 數據的能力。

            jobject 參數引用當前對象。因此,如果 C 或 C
          ++ 代碼需要引用 Java 函數,則這個 jobject 充當引用或指針,返回調用的 Java 對象。


                 ☆第四,五步:編寫C代碼[Windows下得到DLL]
            1)開啟VC;

            
          2)新建->Win32 Dynamic-Link Library工程,工程名為libJavaCallC;

            
          3)在Source Files下新建C文件javaCallC.c;

            
          4)在HeaderFiles下引入頭文件jnidemo_JavaCallC.h;

            
          5)配置路徑,在Tools->Options->Directories下加入JAVA的頭文件,例如:
             C:\Program Files\Java\jdk1.
          6.0\include
             C:\Program Files\Java\jdk1.
          6.0\include\win32
          不然編譯會報錯[Cannot open include file: 
          'jni.h']
          javaCallC.c
            API和類型對照請參考后面的參考資料。
            附:C 和 C++ 函數實現的比較
            C 和 C
          ++ 代碼幾乎相同;唯一的差異在于用來訪問 JNI 函數的方法。在 C 中,JNI 函數調用由“(*env)->”作前綴,目的是為了取出函數指針所引用的值。在 C++ 中,JNIEnv 類擁有處理函數指針查找的內聯成員函數。下面將說明這個細微的差異,其中,這兩行代碼訪問同一函數,但每種語言都有各自的語法。
              C 語法: jsize len 
          = (*env)->GetArrayLength(env,array); 
              C
          ++ 語法: jsize len =env->GetArrayLength(array); 
          Linux得到SO


                 ☆第六步:運行JAVA程序
            1)將libJavaCallC.dll放在環境變量的路徑中;

            
          2)運行:java jnidemo.JavaCallC
          運行結果


                 ☆JNI[其他語言調用JAVA]
            1)希望實現的這部分代碼是平臺無關的,它將用于跨多種平臺使用的功能。

            
          2)需要在本機應用程序中訪問用 Java 語言編寫的代碼或代碼庫。

            
          3)希望從本機代碼利用標準 Java 類庫


                 ☆開發步驟【摘】
            1)編寫 Java 代碼。這個步驟包含編寫一個或多個 Java 類,這些類實現(或調用其它方法實現)您想要訪問的功能。

            
          2)編譯 Java 代碼。在能夠使用這些 Java 類之前,必須成功地將它們編譯成字節碼。

            
          3)編寫 C/C++ 代碼。這個代碼將創建和實例化 JVM,并調用正確的 Java 方法。

            
          4)運行本機 C/C++ 應用程序。將運行應用程序以查看它是否正常工作。我們還將討論一些用于處理常見錯誤的技巧。


                 ☆第一步:編寫Java代碼
          jnidemo.CCallJava.java


                 ☆第二步:編譯Java代碼
            javac CCallJava.java


                 ☆編寫c代碼
          1)開啟VC

          2)新建一個Win32 Console Application工程,如果建立的是Win32 Application工程會報錯[LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16]

          3)在Source Files下新建文件cCallJava.c

          4)將jvm.lib加入到連接中,project->Settings->Link加入jvm.lib,同時配置Tools->Directories->Library files中加入jvm.lib目錄,例如:
             C:\Program Files\Java\jdk1.
          6.0\lib

          5)配置Include路徑,Tools->Directories->Include files加入java的include目錄,例如:
             C:\Program Files\Java\jdk1.
          6.0\include
             C:\Program Files\Java\jdk1.
          6.0\include\win32
          cCallJava.c


                 ☆執行
          1)在編譯的exe文件目錄下新建jnidemo文件夾,把CCallJava.class拷貝到此目錄下;

          2)執行exe文件
          執行結果



                 ☆參考資料
                 JNI的API參考手冊[中文版]
                 IBM開發中心JNI教程
          posted on 2008-02-15 18:20 破繭而出 閱讀(2070) 評論(1)  編輯  收藏 所屬分類: JavaC/C++

          FeedBack:
          # re: JNI
          2008-05-12 12:46 | MX Li
          very good! thanks!  回復  更多評論
            
          主站蜘蛛池模板: 达孜县| 佳木斯市| 合作市| 宜宾市| 安泽县| 苍溪县| 静宁县| 青浦区| 丹阳市| 大同县| 正宁县| 甘泉县| 永登县| 千阳县| 方城县| 肥城市| 靖安县| 曲阳县| 湟中县| 寿光市| 朝阳县| 刚察县| 杨浦区| 永福县| 灌南县| 保靖县| 屏南县| 沙雅县| 青铜峡市| 滨海县| 莱阳市| 甘肃省| 山丹县| 永胜县| 手机| 博湖县| 晴隆县| 甘肃省| 武鸣县| 南岸区| 抚宁县|