Java JNI初探

---說明,以前直接百度出來的例子,照貓畫虎。沒想到的是這例子竟然直接來自百度百科,寫着寫着就囧了。。java

---anyway,寫完了就當是給本身看吧。編程

 

同事求助,就看了一下,照貓畫虎一番,略有所得。編程語言

 

 

JNI是什麼?ui

NI是 Java Native Interface 的縮寫,它提供了若干的API實現了Java和其餘語言的通訊(主要是C&C++)。從Java1.1開始,JNI標準成爲java平臺的一部分,它容許Java代碼和其餘語言寫的代碼進行交互。JNI一開始是爲了本地已編譯語言,尤爲是C和C++而設計的,可是它並不妨礙你使用其餘編程語言,只要調用約定受支持就能夠了。使用java與本地已編譯的代碼交互,一般會喪失平臺可移植性。url

-- 以上來自百度百科spa

 

JNI步驟設計

① java類中編寫帶有native 聲明的方法。3d

② 使用 javac 命令編譯所編寫的java類。code

③ 使用 javah 命令生成頭文件。blog

④ 使用C/C++實現本地方法。

⑤ 生成動態鏈接庫。

⑥ 執行(java)。

--仍是來自百度百科

 

JNI實例

1 public class HelloWorld {
2     public native void displayHelloWorld();//全部native關鍵詞修飾的都是對本地的聲明
3     static {
4         System.loadLibrary("hello");//載入本地庫
5     }
6     public static void main(String[] args) {
7         new HelloWorld().displayHelloWorld();
8     }
9 }

javac HelloWorld.java

javah HelloWorld

編寫本地方法實現和由javah命令生成的頭文件裏面聲明的方法名相同的方法。

  建議用vs,新建 Win Console - DLL 項目,新建文件:HelloWorldImpl.cpp

 1 #include "jni.h"
 2 #include "HelloWorld.h"
 3  
 4 //#include other headers
 5  
 6 JNIEXPORT void JNICALL
 7 Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobject obj)
 8 {
 9     printf("Helloworld!\n");
10     return;
11 }

注意,這裏使用的是"jni.h",也可使用<jni.h>。前者將jni.h文件複製進來便可,後者須要在項目中引入其所在的文件夾($JAVA_HOME$/include)。

可是,據我實測,實際上還須要 jni_md.h 文件,要麼複製進來,要麼引入其所在的文件夾($JAVA_HOME$/include/win32)。

⑤ 如無問題,就能夠進行編譯了。這裏要注意一點,若是jdk是64位版本,那麼dll也須要64位的。vs能夠直接設置生成的版本。

雖然可使用單獨的命令來生成dll文件,不過這裏只是一個練習,直接build項目便可生成,而後在文件夾中就能找到。

⑥ 因爲咱們在Java中調用的hello,因此須要將該dll複製到java所在的文件夾,並重命名。

    static {
        System.loadLibrary("hello");//載入本地庫
    }

而後,運行便可。

 

通常來講,若是第三方有提供dll,那能夠直接調用執行。

 

ps:若是不用vs,那也可使用gcc,參考百度百科

相關文章
相關標籤/搜索