?
在上一篇中,我們說了如何用 Java 調用 Delphi 程序的一個方法并傳遞給其一個字符串參數,現在我們再來看一下如果傳遞的參數是其它基本類型,又要怎么做.
首先,我們先看一下如何傳遞 int 型參數,定義如下的 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;
//我們給這個方法加的參數是: i: JInt
procedure Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject; i: JInt); stdcall;
var
? tmpInt: Integer;
begin
? //參數提交過來的 int 型數據,在這里是一個 JInt 數據,它其實就是一個 Integer 數據,它的使用更加方便
? //它可以直接地參與 Interger 類型數據的運算,是不是很容易.
? tmpInt := i + 100;
? tmpInt := tmpInt - 100;
? Writeln(tmpInt);
end;
exports
??????? Java_alvinJNI_HelloWorld_printText;
end.
//----------------------------------------------------------------------------------------------------------
再看看效果吧,是不是成功了?
這里如果是 long 型參數,接收時要設為 JLong 類型,它也可以跟對應的整型數運算,我們常用它跟 Int64 一起運算
如果參數類型是 float ,接收參數時要設為 JFloat 類型,它也可以跟跟 Single 一起運算
如果參數類型是 double ,接收參數時要設為 JDouble 類型,它也可以跟跟 Delphi 中的 Double 型數據一起運算
如果參數類型是 boolean ,接收參數時要設為 JBoolean 類型,它也可以跟跟 Delphi 中的布爾型數據一起運算
如果參數類型是 short ,接收參數時要設為 JShort 類型,它也可以跟跟 SmallInt 型數據一起運算
如果參數類型是 byte ,接收參數時要設為 JByte 類型,它也可以跟跟 ShortInt 型數據一起運算
如果參數類型是 Object 的 Java 對象,接收時要設為 JObject 類型,它的用法比較復雜(涉及到對 Java 類和對象的操作),我們在以后再來學習.
如果參數類型是 Type[] 數組,接收參數時要設為 JObject 類型,因為 Java 是把數組作為對象看待的.它要以以下的方式來使用:
例如: 我們要給 Delphi 的方法傳入一個 byte[] 型數組,在定義 Delphi 方法時參數聲明為 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);? //調用這個方法,可以將取得參數 bytearray 的地址, isCopy 決定是否復制數組
?//之后,我們可以通過 PByteArr 結合 inc(PByteArr) 這個指針來操作傳過來的數組.
end;
好了,就先說到這里,今天,你是不是又學到了什么?