【詳解】JNI (Java Native Interface) (二)

貓毛·波拿巴發表於2018-10-26

案例二:傳遞引數給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程式

   

  

  成功傳參,並返回計算結果。

 

  

相關文章