jni求助,JVM重复创建失败
我的程序在创建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);