jni簡單一實例

來源:互聯網
上載者:User

1.編寫帶有native聲明的方法的java類

建立HelloWorld.java

class HelloWorld{
    public native void displayHelloWorld();
    static{
        System.loadLibrary("HelloWorldImpl");
    }
    public static void main(String args[]){
        new HelloWorld().displayHelloWorld();
    }
}

聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明改方法為native的,並且不能實現。其中方法的參數和傳回值在後面講述。 Load動態庫:System.loadLibrary("HelloWorldImpl");載入動態庫(我們可以這樣理解:我們的方法 displayHelloWorld()沒有實現,但是我們在下面就直接使用了,所以必須在使用之前對它進行初始化)這裡一般是以static塊進行載入的。同時需要注意的是System.loadLibrary();的參數“hello”是動態庫的名字

2.使用javac命令編譯所編寫的java類

3.使用javah -jni java類名產生副檔名為h的標頭檔

得到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

這裡我們可以這樣理解:這個h檔案相當於我們在java裡面的介面,這裡聲明了一個 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然後在我們的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程式的時候所使用的方法名必須和這裡的一致

4.使用C/C++實現本地方法

建立HelloWorldImpl.cpp

#include "jni.h"
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
    printf("Hello world!\n");
    return;
}

5.將C/C++編寫的檔案產生動態串連庫

本人採用以下方法:

5.1從%JAVA_HOME%/include下COPY

與HelloWorldImpl.cpp同目錄。

5.2 執行cl/LD HelloWorldImpl.cpp 得到HelloWorldImpl.dll檔案

 

也有採用如下方法

產生動態庫這裡以在Windows中為例,需要產生dll檔案。在儲存HelloWorldImpl.cpp檔案夾下面,使用VC的編譯器cl產生。 cl -I%java_home%\include -I%java_home%\include\win32 -I"%cpp_home%"\include -LD HelloWorldImpl.cpp -Fehello.dll 注意:產生的dll檔案名稱在選項-Fe後面配置,這裡是hello,因為在HelloWorld.java檔案中我們loadLibary的時候使用的名字是hello。當然這裡修改之後那裡也需要修改。另外需要將-I%java_home%\include -I%java_home%\include\win32 -I"%cpp_home%"\include參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h檔案(引入了哪些檔案就要加上包含這些檔案的參數)。還要注意的一點是:添加環境變數LIB=%cpp_home%\lib(我機器上的cpp_home=E:\Program Files\Microsoft Visual Studio\VC98),因為需要與裡面的一些lib檔案連結

6.執行class得到結果,註:以上過程檔案均在同一檔案夾下

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.