1,593
社区成员
发帖
与我相关
我的任务
分享
private
FJavaVM: TJavaVM;
FJNIEnv: TJNIEnv;
........
function TFrmMain.InvokingJavaMethod(clsname, mhdname,
inputstr: string): string;
var
Cls: JClass;
Mid: JMethodID;
sResult: WideString;
JStr: JString;
sData: UTF8String;
sMethod, sClass: PAnsiChar;
sRes: string;
begin
sRes := 'error';
try
// 将传入的参数值转成UTF8字符,用于支持中文
sData := UTF8Encode(inputstr);
// 方法名称
sMethod := PAnsiChar(mhdname);
// 类名称
sClass := PAnsiChar(clsname);
// 查找类,注意:类的路径需要做转换,如:cn.com.tcsl.RSA 应转化为 cn/com/tcsl/RSA
Cls := FJNIEnv.FindClass(sClass);
if Cls = nil then
begin
sRes := 'error:no class ' + sClass; //;ShowMessage('无法找到接口类: '+sClass);
result := sRes;
Exit;
end;
// 定位类的静态方法sMethod,并配置参数结构
Mid := FJNIEnv.GetStaticMethodID(Cls, sMethod, '(Ljava/lang/String;)Ljava/lang/String;');
if Mid = nil then
begin
sRes := 'error:no method ' + sMethod; //ShowMessage('无法找到方法: '+sMethod);
result := sRes;
Exit;
end;
// 调用静态方法
JStr := FJNIEnv.CallStaticObjectMethod(Cls, Mid, [sData]);
// 将JString转化成Delphi String,注意:需要使用UTF8Decode解码UTF8字符
sResult := UTF8Decode(FJNIEnv.JStringToString(JStr));
sRes := sResult;
result := sRes;
// 显示结果
//mmoResult.Lines.Add(sResult);
except
on E: Exception do
begin
sRes := 'error:Error ' + E.Message;
result := sRes;
end;
//ShowMessage('Error: ' + E.Message);
end;
end;
procedure TFrmMain.LoadVM;
var
Errcode: Integer;
VM_args: JavaVMInitArgs;
Options: array[0..10] of JavaVMOption;
begin
try
// 创建虚拟机对象,并传入jvm.DLL接口路径
FJavaVM := TJavaVM.Create(JNI_VERSION_1_6, 'jre6\bin\client\jvm.dll');
FillChar(Options, SizeOf(Options), #0);
// 设置jar包或类的搜索路径,多个jar使用分号隔开
Options[0].optionString := '-Djava.class.path=.RSA.jar;Tools.jar'; //
// 声明使用jdk1.6版本
VM_Args.version := JNI_VERSION_1_6;
VM_Args.options := @Options;
VM_Args.nOptions := 1;
VM_Args.ignoreUnrecognized := False;
// 加载虚拟机
ErrCode := FJavaVM.LoadVM(VM_Args);
if ErrCode < 0 then
begin
// Loading the VM more than once will cause this error
if Errcode = JNI_EEXIST then
MessageDlg('Java VM has already been loaded. Only one VM can be loaded.', mtError, [mbOK], 0)
else
ShowMessageFmt('Error creating JavaVM, code = %d', [Errcode]);
Exit;
end;
// Create the Env class
FJNIEnv := TJNIEnv.Create(FJavaVM.Env);
except
on E: Exception do
begin
ShowMessage('Error: ' + E.Message);
Exit;
end;
end;
end;