?
在上一篇中,我們說了如何用 Java 調(diào)用 Delphi 程序的一個方法并傳遞給其一個字符串參數(shù),現(xiàn)在我們再來看一下如果傳遞的參數(shù)是其它基本類型,又要怎么做.
首先,我們先看一下如何傳遞 int 型參數(shù),定義如下的 Java 類:
//----------------------------------------------------------------------------------------------------------
package alvinJNI;
class HelloWorld {
??????? static {
??????????????? System.loadLibrary("DelphiAction");
??????? }
??????? public native void printText(int i);
??????? public static void main(String[] args) {
??????????????? HelloWorld hw = new HelloWorld();
??????????????? hw.printText(100);
??????? }
}
//----------------------------------------------------------------------------------------------------------
我們再像上次一樣在 Delphi 中建立 DLL 工程,寫下面的代碼(有注釋):
//----------------------------------------------------------------------------------------------------------
library DelphiAction;
uses
? JNI;
//我們給這個方法加的參數(shù)是: i: JInt
procedure Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject; i: JInt); stdcall;
var
? tmpInt: Integer;
begin
? //參數(shù)提交過來的 int 型數(shù)據(jù),在這里是一個 JInt 數(shù)據(jù),它其實(shí)就是一個 Integer 數(shù)據(jù),它的使用更加方便
? //它可以直接地參與 Interger 類型數(shù)據(jù)的運(yùn)算,是不是很容易.
? tmpInt := i + 100;
? tmpInt := tmpInt - 100;
? Writeln(tmpInt);
end;
exports
??????? Java_alvinJNI_HelloWorld_printText;
end.
//----------------------------------------------------------------------------------------------------------
再看看效果吧,是不是成功了?
這里如果是 long 型參數(shù),接收時要設(shè)為 JLong 類型,它也可以跟對應(yīng)的整型數(shù)運(yùn)算,我們常用它跟 Int64 一起運(yùn)算
如果參數(shù)類型是 float ,接收參數(shù)時要設(shè)為 JFloat 類型,它也可以跟跟 Single 一起運(yùn)算
如果參數(shù)類型是 double ,接收參數(shù)時要設(shè)為 JDouble 類型,它也可以跟跟 Delphi 中的 Double 型數(shù)據(jù)一起運(yùn)算
如果參數(shù)類型是 boolean ,接收參數(shù)時要設(shè)為 JBoolean 類型,它也可以跟跟 Delphi 中的布爾型數(shù)據(jù)一起運(yùn)算
如果參數(shù)類型是 short ,接收參數(shù)時要設(shè)為 JShort 類型,它也可以跟跟 SmallInt 型數(shù)據(jù)一起運(yùn)算
如果參數(shù)類型是 byte ,接收參數(shù)時要設(shè)為 JByte 類型,它也可以跟跟 ShortInt 型數(shù)據(jù)一起運(yùn)算
如果參數(shù)類型是 Object 的 Java 對象,接收時要設(shè)為 JObject 類型,它的用法比較復(fù)雜(涉及到對 Java 類和對象的操作),我們在以后再來學(xué)習(xí).
如果參數(shù)類型是 Type[] 數(shù)組,接收參數(shù)時要設(shè)為 JObject 類型,因為 Java 是把數(shù)組作為對象看待的.它要以以下的方式來使用:
例如: 我們要給 Delphi 的方法傳入一個 byte[] 型數(shù)組,在定義 Delphi 方法時參數(shù)聲明為 bytearray: JObject
在方法中:
var
?PByteArr: PJByte?? //PJByte 是 JNI.pas 定義的, 里面還有 PJBoolean, PJObject, PJInt 等..
?JVM: TJNIEnv;
?isCopy: Boolean;
begin
?JVM:= TJNIEnv.Create(PEnv);
?isCopy := false;
?PByteArr := JVM.GetByteArrayElements(bytearray, isCopy);? //調(diào)用這個方法,可以將取得參數(shù) bytearray 的地址, isCopy 決定是否復(fù)制數(shù)組
?//之后,我們可以通過 PByteArr 結(jié)合 inc(PByteArr) 這個指針來操作傳過來的數(shù)組.
end;
好了,就先說到這里,今天,你是不是又學(xué)到了什么?