delphi中调用jar包的问题(现金求助)

changzhouyilong 2014-03-25 02:25:10
问题描述:我在delphi中调用jar包的函数,在普通的运行环境下运行无误,该函数是用来解码java的urldecode解码的一个函数,但是我把调用jar包的那一段放到jdhttpServer的IdHTTPServer1CommandGet事件中就报错。
Delphi代码如下

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;


如果将上述的引用InvokingJavaMethod函数放在buttononclick中就可以正常运行,放在idhttpserver中就会报错,错误截图如下


只要高手能帮我解决问题 愿意付现金求助!
...全文
1672 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykfsykfs 2016-05-11
  • 打赏
  • 举报
回复
我现在的环境是win7 64位 jdk是64的1.7 在FJavaVM := TJavaVM.Create(JNI_VERSION_1_4, sjvmPath + '\jre\bin\server\jvm.dll'); 创建时会报错; 网上下了jdk32位的1.6,直接解压,会在ErrCode := FJavaVM.LoadVM(VM_Args); 这句一闪而过,有大神知道是什么原因吗?
azhqiang 2014-07-22
  • 打赏
  • 举报
回复
楼主的问题解决了吗?也想学习下呢。
changzhouyilong 2014-03-25
  • 打赏
  • 举报
回复
可以加我的QQ和我联系吗 1837524928 我可以把测试代码发给你看下
h2plus0 2014-03-25
  • 打赏
  • 举报
回复
请问楼主使用的jni.pas是什么版本, 俺的 JNI_VERSION_1_6 没有定义阿 网上最新版的只定义了 JNI_VERSION_1_4 ?
changzhouyilong 2014-03-25
  • 打赏
  • 举报
回复
刚才忘记发启动jvm的过程了补法一下
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;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧