案例二:傳遞引數給C程式碼,並從其獲取結果
注:這裡傳遞的引數是基本型別的引數,在C程式碼中有直接的對映型別。
此案例所有生成的所有檔案如下:
(1)編寫案例二的Java程式碼,如下:
這裡我們定義了一個native方法,此方法用於計算兩數平均值。將兩個Java int型別的值傳遞給C程式碼,使其計算並返回double值。然後輸出到標準IO流
注:這裡載入動態連結庫的方式,改為了loadLibrary,只需提供庫名即可,但是接下來在執行的時候,需要指定java.library.path,使其指向庫所在的目錄。
(2)編譯java程式碼,並生成標頭檔案
javac 命令有 -h 選項,即編譯並生成標頭檔案,-h 對應的引數,是標頭檔案生成的地址。這裡"."表示,在當前目錄下生成。
生成的標頭檔案如下所示:
(3)編寫原始檔。
這裡C獲取到引數,並輸出到標準IO流,然後將計算結果返回給Java。
(4)利用gcc生成動態連結庫
由於Java環境變數已配置,可直接引用。生成的動態連結庫名為demo.so
(5)設定java.library.path,並執行Java程式
上例,通過java命令的-D選項設定執行時庫路徑,但是仍然提示"找不到"demo2動態庫。
經查閱,發現,在Linux系統中,共享庫(也就是放入java.library.path路徑下的動態庫)必須符合這樣的規範:
Java程式碼:System.loadLibrary("XXXX");
庫檔名:libXXXX.so
在Linux系統下共享庫必須有lib作為字首
故修改demo2.so的檔名為libdemo2.so,並再次執行Java程式
成功傳參,並返回計算結果。
- JNI (Java Native Interface)(一)
- JNI (Java Native Interface) (二)
- JNI (Java Native Interface)(三)
- JNI (Java Native Interface)(四)