跳到主要內容

發表文章

目前顯示的是 3月, 2008的文章

JNI(Java Native Interface) Learning Notes

JNI Learning Notes 要從Java中呼叫第三方C的DLL, cstat.dll,該程式沒有source code無法重新編譯。 因JNI的方式來呼叫的話,C的函數名稱有固定的規則,因為無cstat.dll的原始檔可以修改,因此要用C/C++寫一個中間程式來呼叫cstat.dll。 架構為 Java Class -> intermedia c program -> cstat.dll ( ->代表函數呼叫 ) 產生C header file javah -jni Hello produce Hello.h C compiler Download free cygwin 安裝時要選擇gcc的套件一併安裝,才有gcc可用。 編譯出object file, 要求編譯系統不要使 用 cygwin的DLL gcc -c -I C:/j2sdk1.4.2_13/include -I C:/j2sdk1.4.2_13/include/win32 -mno-cygwin Sample1.c -c 執行編譯 -I 指定jni.h的目錄位置與作業系統相關的header file位置 Build DLL from .o file gcc -shared -o Sample1 .dll Sample1 .o 製作 DLL 時要求編譯系統不要使 用 cygwin 的 DLL gcc -mno-cygwin -shared -o HelloImp.dll HelloImp.o Build DLL directly from .c file gcc -shared -mno-cygwin -I C:/j2sdk1.4.2_13/include -I C:/j2sdk1.4.2_13/include/win32 Arguments.c -o Arguments.dll Final correct command with options gcc -shared -mno-cygwin -Wl,--kill-at -I C:/j2sdk1.4.2_13/include -I C:/j2sdk1.4.2_13/include/win32 Arguments.c -o Arguments.dll -Wl,option 把option傳遞給連接器,如果op

JDK CLASSPATH 設定

JDK CLASSPATH 設定 (configure) Class Path,JRE會依照此路徑的設定去尋找對應的class檔與相關資源(程式要讀取的檔案等)。使用JDK的程式(java.exe or javac.exe),可以不設定classpath,原始會有一個預設值(default class path),就是執行java時的該目錄。 舉例來說,若是要在C:\myproject\下執行Hello.class java Hello 若Hello有用到C:\myproject\下的其他.class檔都可以被搜尋到,不用另外指定。但是若class包在jar檔則無法被引入。 若找不到執行所需要的class會產生如下錯誤: Exception in thread "main" java.lang.NoClassDefFoundError:packagename/classname 若用到的class檔較多、不在同一目錄下或包在jar中,則需要設定CLASSPATH。 有三種方式,不管用哪種方式,一旦設定classpath,JRE就不會再參考預設的classpath設定,會完全按照你設定來找尋class,如果設定不對就會出現前面所述的java.lang.NoClassDefFoundError 一是直接設定在windows系統的環境變數中,一開機就設定好比較方便,如果有修改則需要重開機新的設定才會生效。不管哪個版本大致上是從控制臺>系統>進階>環境變數。 可在命令列模式下輸入: echo %classpath% 系統會顯示目前的classpath設定值 增加一個環境變數為classpath,值可能是: .;C:\Program Files\Shared\dc.jar;C:\Program Files\Java\jdk1.5.0_15\lib;%JAVA_HOME%\lib\tools.jar 分號分隔的各是一個路徑值,請注意第一個值是一個點".",這個代表執行該class當前的目錄,也就是前述的預設值,但因我們現在已經用系統的環境變數去覆蓋預設值,因此必須要設定當前目錄,這是最常見的錯誤,否則會連一個class都執行不起來。 另外兩種就是JDK手冊上提到的方法: 用set指