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

    FeedBack:
    # re: JNI
    2008-05-12 12:46 | MX Li
    very good! thanks!  回復  更多評論
      
    主站蜘蛛池模板: 久久美女网站免费| 亚洲视频在线观看免费| 国产成人啪精品视频免费网| 成视频年人黄网站免费视频| 嫖丰满老熟妇AAAA片免费看| 成人免费的性色视频| 嘿嘿嘿视频免费网站在线观看| 日本免费人成在线网站| 国产成人精品免费午夜app| 在线观看成人免费视频不卡| 中文字幕无码成人免费视频| 夜夜嘿视频免费看| 国产男女猛烈无遮挡免费视频| 全部免费毛片在线| 亚洲一区二区视频在线观看| 亚洲精品自产拍在线观看| 亚洲AV日韩AV天堂一区二区三区| 久久亚洲美女精品国产精品| 久久精品亚洲AV久久久无码 | 亚洲伊人久久综合影院| MM131亚洲国产美女久久| 亚洲女久久久噜噜噜熟女| 亚洲AV午夜成人影院老师机影院| 亚洲人成网站影音先锋播放| 亚洲另类精品xxxx人妖| 亚洲精品无码一区二区| 久久精品国产亚洲av瑜伽| 日韩毛片一区视频免费| a毛片在线免费观看| 91嫩草免费国产永久入口| 女人被免费视频网站| www.亚洲色图.com| 亚洲AV永久纯肉无码精品动漫| 亚洲午夜国产精品无卡| 色偷偷亚洲第一综合网| 两性色午夜视频免费网| 国产免费的野战视频| 国产免费av片在线播放| 亚洲VA中文字幕不卡无码| 国产精品亚洲精品青青青| 深夜a级毛片免费无码|