<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 破繭而出 閱讀(2068) 評論(1)  編輯  收藏 所屬分類: JavaC/C++

    FeedBack:
    # re: JNI
    2008-05-12 12:46 | MX Li
    very good! thanks!  回復  更多評論
      
    主站蜘蛛池模板: 国产h视频在线观看免费| 人人揉揉香蕉大免费不卡| 日韩免费视频观看| 亚洲色大成网站www尤物| 免费无码看av的网站| 国产精品亚洲AV三区| 免费少妇a级毛片人成网| 日亚毛片免费乱码不卡一区| 亚洲精品国产精品乱码不卞| 日韩免费在线中文字幕| 狠狠综合久久综合88亚洲| 在线观看免费黄网站| 99人中文字幕亚洲区| 免费毛片a在线观看67194| 亚洲欧美一区二区三区日产| 免费看小12萝裸体视频国产| 一级毛片无遮挡免费全部| 精品久久香蕉国产线看观看亚洲| 日韩精品无码一区二区三区免费| 亚洲女人影院想要爱| 免费高清av一区二区三区| 五月天婷婷免费视频| 亚洲一卡2卡三卡4卡有限公司| 成年人网站免费视频| 小说专区亚洲春色校园| 亚洲精品无码mv在线观看网站| 中文字幕天天躁日日躁狠狠躁免费| 亚洲成a人片在线看| 亚洲国产成人久久综合区| 一级毛片在线免费看| 亚洲精品无码mⅴ在线观看| 日韩精品电影一区亚洲| 免费视频成人手机在线观看网址| 亚洲精品国产免费| 免费真实播放国产乱子伦| 99xxoo视频在线永久免费观看| 亚洲精华国产精华精华液网站| 亚洲真人日本在线| 最新欧洲大片免费在线| 成人精品视频99在线观看免费| 亚洲国产中文在线二区三区免|