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

案例二:傳遞參數給C代碼,並從其獲取結果html

   注:這裏傳遞的參數是基本類型的參數,在C代碼中有直接的映射類型。java

  

       

  此案例全部生成的全部文件以下:spa

     

 

  (1)編寫案例二的Java代碼,以下:3d

  

  這裏咱們定義了一個native方法,此方法用於計算兩數平均值。將兩個Java int類型的值傳遞給C代碼,使其計算並返回double值。而後輸出到標準IO流htm

  注:這裏加載動態連接庫的方式,改成了loadLibrary,只需提供庫名便可,可是接下來在運行的時候,須要指定java.library.path,使其指向庫所在的目錄。blog

  (2)編譯java代碼,並生成頭文件get

  

  javac 命令有 -h 選項,即編譯並生成頭文件,-h 對應的參數,是頭文件生成的地址。這裏"."表示,在當前目錄下生成。編譯

    生成的頭文件以下所示:變量

  

  (3)編寫源文件。gcc

  

  這裏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程序

   

  

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

 

  

相關文章
相關標籤/搜索