http://teddy-chen-tw.blogspot.tw/2009/07/javanative-code.html
Java中我們可以透過JNI(Java Native Interface) 來呼叫DLL或是Linux裡的lib檔案,
JNA(Java Native Access),可以讓我們簡化JNI的操作,讓它就像呼叫函式一樣簡單,不
必自己再去弄一個head檔出來。
1. 首先到這裡下載JNA,點選右下角的Download ZIP
https://github.com/twall/jna
2.把ZIP檔解壓縮
3.開啟Netbeans ,新建一個Java專案。
4.把剛才的JNA加入Libraries (jna-master/dist/jna.jar)
5.點選Files
6.新增一個資料夾叫lib
7.把jna.jar複制到lib資料夾中
8.程式碼如下
package jna.test; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; /** * * @author 北七部落 */ public class JNATest { //JNA所需要的介面 public interface C_Library extends Library { //先判別系統是否為windows,windows需要呼叫msvcrt,linux則呼叫C String os_c=Platform.isWindows()?"msvcrt":"c"; //初始化實體(載入所需要的dll,msvcrt.dll or c.lib) C_Library INSTANCE=(C_Library) Native.loadLibrary(os_c, C_Library.class); /* 要用到的C語言函式,在C語言中是這樣定義 * printf(格式化輸出數據) 相關函數 scanf,snprintf 表頭文件 #include定義函數 int printf(const char * format,.............); 函數說明 printf()會根據參數format字符串來轉換並格式化數據, 然後將結果寫出到標準輸出設備, 直到出現字符串結束('\0')為止。 * 資料來源 http://people.cs.nctu.edu.tw/~yslin/library/ linuxc/main.htm * 要用用Java的資料型態去對應。 */ int printf(String format ,Object... args); } public static void main(String[] args) { //調用C言函的print C_Library.INSTANCE.printf("hi,I am %s , %d year old , I like this float %f\n", "bert",20,3.1415); } }
9.執行結果
10.我們再來試一下呼叫一下system函式
package jna.test; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; /** * * @author 北七部落 */ public class JNATest { //JNA所需要的介面 public interface C_Library extends Library { //先判別系統是否為windows,windows需要呼叫msvcrt,linux則呼叫C String os_c=Platform.isWindows()?"msvcrt":"c"; //初始化實體(載入所需要的dll,msvcrt.dll or c.lib) C_Library INSTANCE=(C_Library) Native.loadLibrary(os_c, C_Library.class); /* 要用到的C語言函式,在C語言中是這樣定義 * printf(格式化輸出數據) 相關函數 scanf,snprintf 表頭文件 #include定義函數 int printf(const char * format,.............); 函數說明 printf()會根據參數format字符串來轉換並格式化數據, 然後將結果寫出到標準輸出設備,直到出現字符串結束('\0')為止。 * 資料來源 http://people.cs.nctu.edu.tw/~yslin/library/ linuxc/main.htm * 要用用Java的資料型態去對應。 */ int printf(String format ,Object... args); /*要用到的C語言函式,在C語言中是這樣定義 system(執行shell 命令) 相關函數 fork,execve,waitpid,popen 表頭文件 #include 定義函數 int system(const char * string); 函數說明 system()會調用fork()產生子進程,由子進程來調用 /bin/sh-c string來執行參數string字符串所代表的命令, 此命令執行完後隨即返回原調用的進程。 資料來源 http://people.cs.nctu.edu.tw/~yslin/library/ linuxc/main.htm * 要用用Java的資料型態去對應。 */ int system(String shell); } public static void main(String[] args) { //調用C語言的system 來查詢目錄下的檔案 String os_dir=Platform.isWindows()?"dir":"ls"; C_Library.INSTANCE.system(os_dir); //調用C言函的print C_Library.INSTANCE.printf("hi,I am %s , %d year old , I like this float %f\n", "bert",20,3.1415); } }
11.執行結果
12.補充
msvcrt.dll是微軟在windows操作系統中提供的C語言運行庫執行文件(Microsoft C Runtime Library),其中提供了printf,malloc,strcpy等C語言庫函數的具體運行實現,並且為使用C/C++(Vc)編繹的程序提供了初始化(如獲取命令行參數)以及退出等功能。
資料來源
http://baike.baidu.com/view/665378.htm
這段程式碼我在win 7 以及mac 10.10 運行是正常的。
沒有留言:
張貼留言