Java中native方法和JNI基礎

來源:互聯網
上載者:User
Java不是完美的,Java的不足除了體現在運行速度上要比傳統的C++慢許多之外,Java無法直接存取到作業系統底層(如系統硬體等),為此Java使用native方法來擴充Java程式的功能。

  可以將native方法比作Java程式同C程式的介面,其實現步驟:

  1、在Java中聲明native()方法,然後編譯;

  2、用javah產生一個.h檔案;

  3、寫一個.cpp檔案實現native匯出方法,其中需要包含第二步產生的.h檔案(注意其中又包含了JDK帶的jni.h檔案);

  4、將第三步的.cpp檔案編譯成動態連結程式庫檔案;

  5、在Java中用System.loadLibrary()方法載入第四步產生的動態連結程式庫檔案,這個native()方法就可以在Java中被訪問了。

  JAVA本地方法適用的情況

  1.為了使用底層的主機平台的某個特性,而這個特性不能通過JAVA API訪問

  2.為了訪問一個老的系統或者使用一個已有的庫,而這個系統或這個庫不是用JAVA編寫的

  3.為了加快程式的效能,而將一段時間敏感的代碼作為本地方法實現。

  首先寫好JAVA檔案

  /*

  * Created on 2005-12-19 Author shaoqi

  */

  package com.hode.hodeframework.modelupdate;

  public class CheckFile

  {

  public native void displayHelloWorld();

  static

  {

  System.loadLibrary("test");

  }

  public static void main(String[] args) {

  new CheckFile().displayHelloWorld();

  }

  }

  然後根據寫好的檔案編譯成CLASS檔案

  然後在classes或bin之類的class根目錄下執行javah -jni com.hode.hodeframework.modelupdate.CheckFile,

  就會在根目錄下得到一個com_hode_hodeframework_modelupdate_CheckFile.h的檔案

  然後根據標頭檔的內容編寫com_hode_hodeframework_modelupdate_CheckFile.c檔案

  #include "CheckFile.h"

  #include

  #include

  JNIEXPORT void JNICALL Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env, jobject obj)

  {

  printf("Hello world!\n");

  return;

  }

  之後編譯產生DLL檔案如“test.dll”,名稱與System.loadLibrary("test")中的名稱一致

   vc的編譯方法:cl -I%java_home%\include -I%java_home%\include\win32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll

  最後在運行時加參數-Djava.library.path=[dll存放的路徑]

 

JNI入門:

   本文講述如何使用JNI技術實現HelloWorld,目的是讓讀者熟悉JNI的機制並編寫第一個HelloWorld程式。

    Java Native Interface(JNI)是Java語言的本地編程介面,是J2SDK的一部分。在java程式中,我們可以通過JNI實現一些用java語言不便實現的功能。通常有以下幾種情況我們需要使用JNI來實現。

  • 標準的java類庫沒有提供你的應用程式所需要的功能,通常這些功能是平台相關的
  • 你希望使用一些已經有的類庫或者應用程式,而他們並非用java語言編寫的
  • 程式的某些部分對速度要求比較苛刻,你選擇用彙編或者c語言來實現並在java語言中調用他們

    在《java核心技術》中,作者提到JNI的時候,建議不到萬不得已不要使用JNI技術,一方面它需要你掌握更多的知識才可以駕馭,一方面使用了JNI你 的程式就會喪失可移植性。在本文我們跳過JNI的底層機制,讀者最好先把它想象為本地代碼和java代碼的粘合劑。關係如所示:

 

 

 

 

 

 

 

    下面我們開始編寫HelloWorld程式,由於涉及到要編寫c/c++代碼因此我們會在開發中使用Microsoft VC++工具。

  1. 編寫java代碼
    我們在硬碟上建立一個hello目錄作為我們的工作目錄,首先我們需要編寫自己的java代碼,在java代碼中我們會聲明native方法,代碼非常簡單。如下所示
    class HelloWorld
    {
        public native void displayHelloWorld();
        static {
            System.loadLibrary("hello");
        }
       
        public static void main(String[] args) {
            new HelloWorld().displayHelloWorld();
        }
    }
    注 意我們的displayHelloWorld()方法的聲明,它有一個關鍵字native,表明這個方法使用java以外的語言實現。方法不包括實現,因 為我們要用c/c++語言實現它。注意System.loadLibrary("hello")這句代碼,它是在靜態初始化塊中定義的,系統用來裝載 hello共用庫,這就是我們在後面產生的hello.dll(如果在其他的作業系統可能是其他的形式,比如hello.so)
  2. 編譯java代碼
    javac HelloWorld.java  產生HelloWorld.class檔案
  3. 建立.h檔案
    這一步中我們要使用javah命令產生.h檔案,這個檔案要在後面的c/c++代碼中用到,我們運行
    javah HelloWorld。這樣我們可以看到在相同目錄下產生了一個HelloWorld.h檔案,檔案內容如下
    在此我們不對他進行太多的解釋。
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */
    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    displayHelloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
      (JNIEnv *, jobject);
    #ifdef __cplusplus
    }
    #endif
    #endif
  4. 編寫本地實現代碼
    在這部分我們要用C/C++語言實現java中定義的方法,我們在VC++中建立一個Project,然後建立一個HelloWorldImp.cpp檔案,內容如下
    #include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>

    JNIEXPORT void JNICALL
    Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
    {
        printf("Hello world!\n");
        return;
    }
    注意我們這裡include了 jni.h和剛才得到的HelloWorld.h檔案。因此你要在VC++裡面設定好,jni.h在JAVA_HOME/include裡面。編譯通過後再產生hello.dll檔案。

  5. 運行java程式
    把上面產生的hello.dll檔案複製到我們的工作目錄,這時候我們的目錄中包括HelloWorld.java,HelloWorld.class和hello.dll檔案。運行java HelloWorld命令,則可在控制台看到Hello world|
    的輸出了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.