自學Java三月之 JNI初探發現不可不知的祕密

JNI是什麼?

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

------------------------------------------------------------------------------------以上來自百度百科

JNI步驟

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

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

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

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

⑤ 生成動態連接庫。

⑥ 執行(java)。

---------------------------------------------------------------------------------還是來自百度百科

JNI實例

public class HelloWorld {
    public native void displayHelloWorld();//所有native關鍵詞修飾的都是對本地的聲明
    static {
        System.loadLibrary("hello");//載入本地庫
    }//加入Java開發交流君樣:756584822一起吹水聊天
    public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
    }
}

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 }//加入Java開發交流君樣:756584822一起吹水聊天

注意,這裏使用的是"jni.h",也可以使用<jni.h>。前者將jni.h文件複製進來即可,後者需要在項目中引入其所在的文件夾( J A V A H O M E JAVA_HOME JAVAHOME/include)。

但是,據我實測,實際上還需要 jni_md.h 文件,要麼複製進來,要麼引入其所在的文件夾( J A V A H O M E JAVA_HOME JAVAHOME/include/win32)。

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

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

⑥ 由於我們在Java中調用的hello,所以需要將該dll複製到java所在的文件夾,並重命名。

    static {
        System.loadLibrary("hello");//載入本地庫
    }//加入Java開發交流君樣:756584822一起吹水聊天

然後,運行即可。

在這裏插入圖片描述

一般來說,如果第三方有提供dll,那可以直接調用執行。

ps:如果不用vs,那也可以使用gcc,參考百度百科。

image

最新2020整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友請加Q君樣:756584822

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章