我的程序在创建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);