posts - 108,comments - 56,trackbacks - 0
          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          常用鏈接

          隨筆分類(145)

          隨筆檔案(53)

          我的鏈接

          收藏BLOG

          搜索

          •  

          最新評論

          閱讀排行榜

          JNI
                 ☆JNI
             【摘】Java 本機(jī)接口(Java Native Interface (JNI))是一個本機(jī)編程接口,它是 Java 軟件開發(fā)工具箱(Java Software Development Kit (SDK))的一部分。JNI 允許 Java 代碼使用以其它語言(譬如 C 和 C++)編寫的代碼和代碼庫。Invocation API(JNI 的一部分)可以用來將 Java 虛擬機(jī)(JVM)嵌入到本機(jī)應(yīng)用程序中,從而允許程序員從本機(jī)代碼內(nèi)部調(diào)用 Java 代碼。


                 ☆JNI [Java調(diào)用其他語言]運(yùn)用方向【摘】
            1)希望用更低級、更快的編程語言去實(shí)現(xiàn)對時間有嚴(yán)格要求的代碼。

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

             
          3)需要標(biāo)準(zhǔn) Java 類庫中不支持的依賴于平臺的特性。


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

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

            
          3)創(chuàng)建 C/C++ 頭文件。C/C++ 頭文件將聲明想要調(diào)用的本機(jī)函數(shù)說明。然后,這個頭文件與 C/C++ 函數(shù)實(shí)現(xiàn)(請參閱步驟 4)一起來創(chuàng)建共享庫(請參閱步驟 5)。

            
          4)編寫 C/C++ 代碼。這一步實(shí)現(xiàn) C 或 C++ 源代碼文件中的函數(shù)。C/C++ 源文件必須包含步驟 3 中創(chuàng)建的頭文件。

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

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


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


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


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

            jobject 參數(shù)引用當(dāng)前對象。因此,如果 C 或 C
          ++ 代碼需要引用 Java 函數(shù),則這個 jobject 充當(dāng)引用或指針,返回調(diào)用的 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
          不然編譯會報(bào)錯[Cannot open include file: 
          'jni.h']
          javaCallC.c
            API和類型對照請參考后面的參考資料。
            附:C 和 C++ 函數(shù)實(shí)現(xiàn)的比較
            C 和 C
          ++ 代碼幾乎相同;唯一的差異在于用來訪問 JNI 函數(shù)的方法。在 C 中,JNI 函數(shù)調(diào)用由“(*env)->”作前綴,目的是為了取出函數(shù)指針?biāo)玫闹怠T?nbsp;C++ 中,JNIEnv 類擁有處理函數(shù)指針查找的內(nèi)聯(lián)成員函數(shù)。下面將說明這個細(xì)微的差異,其中,這兩行代碼訪問同一函數(shù),但每種語言都有各自的語法。
              C 語法: jsize len 
          = (*env)->GetArrayLength(env,array); 
              C
          ++ 語法: jsize len =env->GetArrayLength(array); 
          Linux得到SO


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

            
          2)運(yùn)行:java jnidemo.JavaCallC
          運(yùn)行結(jié)果


                 ☆JNI[其他語言調(diào)用JAVA]
            1)希望實(shí)現(xiàn)的這部分代碼是平臺無關(guān)的,它將用于跨多種平臺使用的功能。

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

            
          3)希望從本機(jī)代碼利用標(biāo)準(zhǔn) Java 類庫


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

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

            
          3)編寫 C/C++ 代碼。這個代碼將創(chuàng)建和實(shí)例化 JVM,并調(diào)用正確的 Java 方法。

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


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


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


                 ☆編寫c代碼
          1)開啟VC

          2)新建一個Win32 Console Application工程,如果建立的是Win32 Application工程會報(bào)錯[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


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

          2)執(zhí)行exe文件
          執(zhí)行結(jié)果



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

          FeedBack:
          # re: JNI
          2008-05-12 12:46 | MX Li
          very good! thanks!  回復(fù)  更多評論
            
          主站蜘蛛池模板: 罗江县| 南投市| 塔河县| 正镶白旗| 岳阳县| 分宜县| 平凉市| 建瓯市| 延安市| 泽州县| 桑植县| 泗水县| 梅州市| 兴文县| 绥宁县| 南丹县| 泰安市| 光泽县| 屯留县| 正定县| 兴隆县| 鹿泉市| 元阳县| 昌乐县| 运城市| 松桃| 万盛区| 桐柏县| 临西县| 瑞安市| 广灵县| 黄石市| 类乌齐县| 耒阳市| 靖州| 上犹县| 西林县| 和平县| 西昌市| 伊吾县| 宁武县|