Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Delphi и Java


Автор: CynicRus 14.6.2012, 12:30
Приветствую уважаемых форумчан. Пытаюсь сделать загрузчик для игры, написаной на java. Соответсвенно - для вызова необходимых мне функций из java приложения использую jni.pas:
Код

procedure TForm1.RunRS;
var
 JavaVM: TJavaVM;
 JNIEnv: TJNIEnv;
 Options: array [0..4] of JavaVMOption;
 VM_args: JavaVMInitArgs;
 Errcode: Integer;
 Cls: JClass;
 Mid: JMethodID;
 args: jobjectArray;
begin
 JavaVM := TJavaVM.Create(JNI_VERSION_1_6,'C:\Program Files\Java\jre7\bin\client\jvm.dll');
 Options[0].optionString := PAnsiChar(Params);
 VM_args.version := JNI_VERSION_1_6;
 VM_args.options := @Options;
 VM_args.nOptions := 1;
 Errcode := JavaVM.LoadVM(VM_args);
    if Errcode < 0 then
    begin

      Exit;
    end;
 JNIEnv := TJNIEnv.Create(JavaVM.Env);
 Cls := JNIEnv.FindClass('jagexappletviewer');
    if Cls = nil then
    begin
   
      Exit;
    end;
  Mid := JNIEnv.GetStaticMethodID(Cls, 'main', '([Ljava/lang/String;)V');
  args:= JNIEnv.NewObjectArray(1,JNIEnv.FindClass('java/lang/String'),0);
    if Mid = nil then
    begin
      Exit;
    end;
    JNIEnv.SetObjectArrayElement(args,0,JNIEnv.NewStringUTF('runescape.jar'));
    JNIEnv.CallStaticVoidMethod(Cls, Mid, []);
end;

Код собирается без ошибок, однако - по непонятной причине выдает: Access violation at address 6BF3D3D5 in MSVCR100.dll, read of address 0000000. jvm.dll - на всякий закинул даже в каталог с программой, все равно ошибка. В чем может быть проблема?
PS: по отладчику программа выпадает в функции jni.pas:
Код

function TJavaVM.LoadVM(const Options: JavaVMInitArgs): JInt;
begin
  if not FIsInitialized then
    raise EJVMError.Create('JavaVM has not been initialized');
  FJavaVMInitArgs := Options;
  Result := FJNI_CreateJavaVM(@FJavaVM, @FEnv, @FJavaVMInitArgs);
end;
 в строке
Код

Result := FJNI_CreateJavaVM(@FJavaVM, @FEnv, @FJavaVMInitArgs);
. т
Файл проекта прилагаю. Заранее извиняюсь за качество кода,  но - надо же как-то учиться-)
http://rghost.ru/38655741

Автор: Illusion Dolphin 14.6.2012, 14:25
Код

JavaVM := TJavaVM.Create(JNI_VERSION_1_6,'C:\Program Files\Java\jre7\bin\client\jvm.dll');


А не может быть что JNI_VERSION_1_6 не очень хорошо работает "jre7" (6<>7)?

Автор: CynicRus 14.6.2012, 15:27
Ваше предположение оказалось верно, чуть поправил jni.pas  , и ошибка исчезла. Вот код поправленого модуля, может кому пригодиться
: http://pastebin.com/wrx0f2hx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)