有些時候,要寫一些程序,在 JAVA 里面好難實現, 但如果使用其它編程語言卻又比較容易時,我們不妨通過 JNI 來讓不同語言的程序共同完成.
JNI 的教程, 網上 C 的比較多,Java 也提供了 javah.exe 為 C 語言的 JNI 程序生成頭文件, 如果你是一個 Delphi 編程員, 能否讓 JAVA 與 Delphi 程序交互呢? 答案是肯定的,今天我們就來看一下一個簡單的例子.
Helloworld. 主要是來認識一下, JAVA 怎樣調用 Delphi 程序的方法.
好的,我們先來創建一個類:
package alvinJNI;
class HelloWorld {
static {
System.loadLibrary("DelphiAction"); //等一下我們就用Delphi來編一個程序,編好之后生成的文件就是 DelphiAction.dll 這是一個動態鏈接庫文件,這個類里先在靜態語句塊中加載它
}
public native void printText(); //聲明一個 native 的本地代碼程序,我們使用的是 Delphi 來編寫.注意:這個方法在這里只是聲明,并沒有定義方法體,因為這個方法我們要用 Delphi 來實現.
public static void main(String[] args) {
//創建對象并調用里面的 native 方法.
HelloWorld hw = new HelloWorld();
hw.printText();
}
}
類寫完編譯后,接下來的事情就由 Delphi 來解決了
我們運行 Delphi 后新建 DLL 工程: file->new->other,然后在 new 選項卡里面選擇 Dll Wizard 就創建了一個新的工程了,
我們選擇一個文件夾來保存工程
在保存工程后,我們需要下載 jni.pas 加入到我們的工程中,這是國外的高手寫的程序單元,它方便我們的 Delphi 程序與 JAVA 交互. 可從下面地址下載到:
http://www.tkk7.com/Files/alvin/jni_pas.zip
解壓之后里面有兩個文件,將其存放在工程的目錄下
接下來我們編寫 Delphi 代碼:
library DelphiAction; //這里設置動態鏈接庫的名稱,因為我們剛才寫 JAVA 類時是用 DelphiAction,所以這里了要設置為 DelphiAction
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. 這里面都是注釋,是自動生成的,可以刪去 }
Uses
JNI; //注意了,我們剛才下載了 JNI.pas 放在工程目錄中,這里要在 Uses 里面聲明,才能使用.
//下面我們來寫一個函數,就是為 剛才 JAVA 類實現一個簡單的方法
//因為要讓 JAVA 能夠調用到這個函數,所以這個函數的命名是非常講究的,名稱各段的分隔符是 _ 下劃線
//本例的函數如下: 即 Java_包名_類名_類中的方法名
//函數必須設置為 stdcall
procedure Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject); stdcall;
begin
//函數體非常簡單,因為我們只是了解一下如何調用 Delphi 的函數.
Writeln('您好!看到效果了吧。');
end;
exports
Java_alvinJNI_HelloWorld_printText; //為函數做引出聲明,這樣才能真正的被調用到
end.
代碼完成,我們 Ctrl+F9 編譯 DLL
生成 DelphiAction.dll 后,我們把他復制到 Java 工程目錄
注意:上面的類是打包在 alvinJNI 包中
假如我們的 Java 工程是在 C:/test
那么剛才編譯后的類必須放在 c:/test/alvinJNI/HelloWorld.class
而剛剛編譯完成的 DelphiAction.dll就放在 c:/test/DelphiAction.dll
然后在 C:/test 目錄中執行: java alvinJNI/HelloWorld
看看你的 Java 程序調用了 DelphiAction 是怎么樣的效果.
呵呵,爽吧! 今天我們才做了一點點,只學了一下如何在 JAVA 調用 Delphi 和程序,在接下來,我會貼出更多的教程,以學習一些高級一點點的 JNI 知識.