jni求助,JVM重复创建失败

beiguofengguang 2009-12-23 10:38:53
我的程序在创建JVM的时候,第一次都是成功的,但在释放调后第二次创建的时候就失败,把程序关掉再启动重新创建又可以,这是什么原因导致的?
请各位大虾给诊断下:
创建代码:
var
jvm: Jni.PJavaVM;
env: Jni.PJNIEnv;

{ 打开注册表,查找 JVM.dll 的路径 }
function GetJVMPath(): String;
var
s: Tregistry;
lStr: String;
begin
s := Tregistry.Create();
s.RootKey := Windows.HKEY_LOCAL_MACHINE;
s.OpenKeyReadOnly('SOFTWARE\JavaSoft\Java Runtime Environment');
lStr := s.ReadString('CurrentVersion');
s.CloseKey();
s.OpenKeyReadOnly('SOFTWARE\JavaSoft\Java Runtime Environment\' + lStr);
Result := s.ReadString('RuntimeLib');
s.CloseKey();
s.Free();
end;

function InitJVM(): Boolean;
var
vm_args: Jni.JavaVMInitArgs;
options: array[0..2] of Jni.JavaVMOption;
jvmPath: String;
rec: Integer;
begin
Result := false;
jvmPath := GetJVMPath();
//jvmPath := ExtractFilePath(application.ExeName) + 'jvm.dll';
//JNI.LoadJVM(jvmPath);

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

{ Java 的启动路径 这里设为当前路径. 也就是说在这个路径必须得能找到 Test.class }
options[1].optionString := '-Djava.class.path=.';

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

JNI.JNI_GetDefaultJavaVMInitArgs(@vm_args, jvmPath);
vm_args.version := Jni.JNI_VERSION_1_4;
vm_args.options := @options;
vm_args.nOptions := 3;
vm_args.ignoreUnrecognized := Jni.JNI_TRUE;

rec := JNI.JNI_CreateJavaVM(@jvm, @env, @vm_args, jvmPath);
if (rec = JNI_ERR) then begin
showmessage('不能创建 JVM');
end else begin
Result := true;
end;
//showmessage(jvmPath);
end;

调用代码:
procedure TFrmInitTransCard.Button1Click(Sender: TObject);
var
cid: Jni.JClass;
mid: Jni.JMethodID;
tenv: Jni.TJNIEnv;

mainArgs: array[0..0] of Jni.jvalue;
ary: Jni.jarray;
begin
if FInit Then
begin
cid := env^.FindClass(env, 'Test'); // 查找 Test 类

{ 获得 main 方法ID, GetStaticMethodID 的使用,在前面也有说过 }
mid := env^.GetStaticMethodID(env, cid, 'main', '([Ljava/lang/String;)V');

tenv := JNI.TJNIEnv.Create(env);

{ 创建参数数组 }
ary := tenv.NewObjectArray(1, tenv.FindClass('java/lang/String'), 0);
tenv.SetObjectArrayElement(ary, 0, tenv.StringToJString(pchar(UTF8Encode('你好!'))));
mainArgs[0].l := ary;

{ 调用 main 方法 }
tenv.CallStaticVoidMethodA(cid, mid, @mainArgs);

FreeAndNil(tenv);
end;
end;

释放代码:
jvm^.DetachCurrentThread(jvm);
jvm^.DestroyJavaVM(jvm);
...全文
261 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangtao6888 2012-07-11
  • 打赏
  • 举报
回复
接分来了,收收10分
beiguofengguang 2009-12-25
  • 打赏
  • 举报
回复
变通了下,改成程序开始运行的时候创建,关闭的时候释放,这样就没问题了
imho888 2009-12-23
  • 打赏
  • 举报
回复
没做过,友情帮顶

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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