您的位置:首页 > 编程语言 > Delphi

delphi调用java类(通过jni.pas)

2012-07-11 08:36 281 查看


delphi调用java类(通过jni.pas)

(2010-03-20 23:41:09)


转载▼

标签:


杂谈

分类: java
unit test;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,jni;

type

TForm1 = class(TForm)

Button1: TButton;

Edit1: TEdit;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

jvm: Jni.PJavaVM;

tenv: Jni.TJNIEnv;

cid: Jni.JClass;

mid: Jni.JMethodID;

tmp: Jni.JString;

sj:Jni.JString;

vm_args: Jni.JavaVMInitArgs; //建立 JVM 的參數

options: array[0..2] of Jni.JavaVMOption;

env: Jni.PJNIEnv;

rec: Integer;

jclsIns:JObject;

ret:String;

const

str='傳給java的參數是--' +'你好,java jni,我要战胜你!';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

excep:Jni.JThrowable;

pjval:jni.PJValue;

begin

options[0].optionString := '-Djava.compiler=NONE';

options[1].optionString := '-Djava.class.path=D:\\insure_XT\\insurext\\build\\classes'; // Java 工程路徑, '.' 表示黨前路徑

options[2].optionString := '-verbose:jni';

JNI_GetDefaultJavaVMInitArgs(@vm_args);

vm_args.version := Jni.JNI_VERSION_1_6;

vm_args.options := @options;

vm_args.nOptions := 3;

vm_args.ignoreUnrecognized := Jni.JNI_TRUE;

rec := Jni.JNI_CreateJavaVM(@jvm, @env, @vm_args); //建立JVM

if (rec = JNI_ERR ) then begin

edit1.Text:='建立java虚拟机jvm出错(Jni.JNI_CreateJavaVM)';

exit;

end;

tenv := TJNIEnv.Create(env);

if tenv=nil then Begin

edit1.Text:='获取java环境出错';

Exit;

End;

//取得 DelphiCallJava 的類ID, 如果有'包',也指定, <package>.<class>

cid := tenv.FindClass('insure/Test');

if (tenv.ExceptionCheck()) then begin

edit1.Text:='找不到类insure.Test';

excep:=tenv.ExceptionOccurred;

tenv.ExceptionClear;

freeAndNil(tenv);

jvm^.DestroyJavaVM(jvm);

Exit;

end

else

begin

edit1.Text:='找到类insure/Test';

end;

//初始化类的新实例

mid:=tenv.GetMethodID(cid,'<init>','()V');

if(mid=nil) then begin

edit1.Text:='获取Test类的构造函数出错';

freeAndNil(tenv);

jvm^.DestroyJavaVM(jvm);

Exit;

end;

jclsIns:=tenv.NewObjectV(cid,mid,nil);

if(jclsIns=nil) then begin

edit1.Text:='初始化类出错';

freeAndNil(tenv);

jvm^.DestroyJavaVM(jvm);

Exit;

end;

//取得方法ID

mid := tenv.GetMethodID(cid, 'jniTest', '(Ljava/lang/String;)Ljava/lang/String;'); //(Ljava/lang/String;)I

if (mid = nil) then begin

edit1.Text:='找不到方法jniTest';

freeAndNil(tenv);

jvm^.DestroyJavaVM(jvm);

Exit;

end

else

edit1.Text:='找到jniTest方法';

//將 string 轉換成 java string

tmp := tenv.StringToJString(PChar(UTF8Encode(str)));

//用類ID和方法ID調用 JAVA 方法

//pjval:=tenv.ArgsToJValues([tmp]);

sj:=tenv.CallObjectMethod(jclsIns, mid,[tmp]);

//sj:=env^.CallIntMethodV(env,cid,mid,nil);

//ret:=tenv.JStringToString(sj);

ret:=tenv.UnicodeJStringToString(sj);

self.Canvas.TextOut(40,40, str);

self.canvas.textout(60,60,'返回值为--' + ret);

edit1.Text:='从java类获取的方法结果为';

if tenv<>nil then begin

freeAndNil(tenv);

jvm^.DestroyJavaVM(jvm); //釋放JVM資源

End;

end;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: