JNI靜態注冊與動態注冊詳解


JNI注冊,是指將java層方法(native關鍵字修飾的)和C層方法對應起來,以實現java層代碼調用c層代碼的目的。JNI注冊分為靜態注冊和動態注冊兩種,靜態注冊是通過固定格式方法名進行關聯,動態注冊是通過動態添加映射關系來進行關聯,方法名可以隨便起,比較靈活,我們推薦使用動態注冊。在進行注冊前,需要先下載兩個工具Clion和eclipse(能寫java application就可以),然后我們就可以開始注冊了。

靜態注冊

1.首先,在eclipse新建一個Java Application,名稱可以隨意,比如叫JavaJni,然后在src目錄下新建一個package名為clz,再clz包下新建java類Register.java,類中寫一個native方法如下:

2.進入命令行,來到Register.java所在目錄下,使用命令 javac Register.java生成Register.class文件
3.命令行,回到src目錄下,通過命令 javah clz.Register 生成clz_Register.h
4.在Clion中,新建一個C++ Library,Library type選擇shared,並將jdk/include下的jni.h文件和jni_md.h文件拷貝過來
5.將第三步中生成的clz_Register.h文件拷貝到Clion中剛剛新建的項目中
6.修改jni.h的引用如下:

  1. 新建clz_Register.c文件,引入clz_Register.h,實現.h中對應的函數

  1. 在Clion項目中的CMakeLists.txt中添加編譯配置

  • 第一個參數firstlib,表示編譯后生成的動態庫名稱
  • 第二個參數可以選擇STATIC或者SHARED,分別表示是靜態庫還是動態庫,一般我們使用動態庫
  • 第三個及后面的參數,表示需要編譯入庫的文件

9.在Clion中選擇Build-BuildProject,可以在cmake-build-debug下生成libfirstlib.dylib(mac為dylib,windows為dll)
10.將第8步生成的libfirstlib.dylib拷貝到eclipse項目的libs目錄下(沒有可新建)
11.在Register.java中加載庫,並且調用庫中函數

動態注冊

  1. 首先,在eclipse新建一個Java Application,名稱可以隨意,比如叫JavaJni,然后在src目錄下新建一個package名為register,在register包下新建java類DynamicRegister.java,類中寫native方法如下:

  1. 在Clion中,新建一個C++ Library,Library type選擇shared,並將jdk/include下的jni.h文件和jni_md.h文件拷貝過來
  2. 新建DynamicRegister.c文件,引入jni.h和實現兩個方法,如下

  1. 添加動態注冊

  1. 在Clion項目中的CMakeLists.txt中添加編譯配置

  • 第一個參數firstlib,表示編譯后生成的動態庫名稱
  • 第二個參數可以選擇STATIC或者SHARED,分別表示是靜態庫還是動態庫,一般我們使用動態庫
  • 第三個及后面的參數,表示需要編譯入庫的文件

6.在Clion中選擇Build-BuildProject,可以在cmake-build-debug下生成libfirstdylib.dylib(mac為dylib,windows為dll)
7.將第8步生成的libfirstdylib.dylib拷貝到eclipse項目的libs目錄下(沒有可新建)
8.在DynamicRegister.java中加載庫,並且調用庫中函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM