七步入門JNI

JNI使用方法記錄

JNI是用來幹嘛的

JNI 全稱是Java Native Interface,中文譯名叫java本地接口。
當需要實現一些Java語言難以完成的事情時,就可以考慮使用JNI來調用其他的語言庫來實現。

怎麼在自己的代碼中使用JNI

本文將簡潔地展示使用JNI調用dll的過程。

  • 第一步,編寫有native方法的類
    文件HellpJNI.java內容如下:
    public class HelloJNI {
    /**
     * 這是native方法,稍後會在要導入的dll中定義方法體
     */
    native public void sayHello();
    
    public static void main(String[] args) {
    	//	這裏打印java的library,dll是在library目錄裏進行查詢
    	System.out.println(System.getProperty("java.library.path"));
    	HelloJNI h = new HelloJNI();
    	//	導入dll
    	//	用System.load 或者 System.loadLibrary 進行導入dll
    	System.loadLibrary("HelloJNI");
    	//	調用native方法
    	h.sayHello();
    }
    

}
```

  • 第二步,將第一步中的類編譯爲class文件

    javac HelloJNI.java
    

    這一步會生成HelloJNI.class文件

  • 第三步,使用javah按照第二步的class文件中的native方法定義生成c語言的頭文件

    javah HelloJNI
    

    這裏會生成一個.h文件HelloJNI.h,該文件內容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloJNI */
    
    #ifndef HelloJNI
    #define HelloJNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloJNI
     * Method:    sayHello
     * Signature: ()V
     */
     // 這裏是函數的定義
    JNIEXPORT void JNICALL HelloJNI_sayHello
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    
  • 第四步,按照第四步的.h文件中的函數定義,定義函數體
    文件HelloJNI.c內容如下:

    #include <stdio.h>
    #include <jni.h>
    #include "com_wby_wincontrol_jni_HelloJNI.h"
    
    JNIEXPORT void JNICALL HelloJNI_sayHello
      (JNIEnv *param, jobject object){
        printf("hello");
        return;
      }
    
  • 第五步,將第四步的.c文件生成動態鏈接庫dll

    gcc -shared -I %JAVA_HOME%/include -I %JAVA_HOME%/include/win32 HelloJNI.c -o HelloJNI.dll
    

    -shared表示生成動態鏈接庫
    -o表示輸入的文件名
    -I表示頭文件的查詢路徑,以上兩個路徑是java JNI 必要的頭文件,因爲沒有添加到gcc的查找路徑裏,所以需要手動指定路徑

    這一步會生成HelloJNI.dll文件

  • 第六步,將dll添加到java項目的library中
    如果你使用的是IDEA或者Eclipse,可以直接添加到library中
    如IDEA,進入project structure ,按照下圖,選擇dll文件後一路點擊ok
    在這裏插入圖片描述

    如果直接使用java命令啓動,可以將dll所在目錄添加到系統的環境變量

  • 第七步,啓動項目

注意事項

  • native方法調用前,必須要引用dll文件,這個引入的操作,不一定在這個類加載的時候引入,意思是可以在其他類中使用System.loadLibrary()方法引入
  • native方法調用時,如果dll中沒有定義,會報錯;如果未定義但是不調用,則不會報錯
  • System.load()的參數是dll的絕對路徑;System.loadLibrary()的參數是dll的文件名
  • System.getProperty("java.library.path") 其實就是系統環境變量path中的目錄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章