1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Лаунчер с JNI

Тема в разделе "Оффтопик", создана пользователем EpicLoyd, 11 апр 2015.

  1. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    Пишу лаунчер.... столкнулся с проблемой...launcherwrapper не хочет загружать твик от forge, методом долгого дебага и танцев с бубном выяснил, что joptsimple.OptionParser вообще не парсит строку, каким бы способом я не передавал аргументы.

    Code:
    Код:
     
            id = env->GetStaticMethodID(temp, "main", "([Ljava/lang/String;)V");
            jobjectArray ar = env->NewObjectArray(1, env->FindClass("java/lang/String"), NULL);
            env->SetObjectArrayElement(ar, 0, env->NewStringUTF(args.toUtf8().data()));
            env->CallStaticVoidMethod(temp,id, ar);
    
    P.S Использую QT5. Может проблема в нем :d
     
  2. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Если в args у тебя строка с аргументами целиком (например, такая: '--username Player --accessToken 12345 ...'), то работать и не должно.

    Тебе нужно передавать название параметра и аргумент параметра в новом элементе массива, чтобы массив выглядел так:
    [0]: --username
    [1]: Player
    [2]: --accessToken
    [3]: 12345
    Код:
    // Создаём массив для аргументов:
    JavaObjectArray = Env->NewObjectArray(Env, 4, Env->FindClass(Env, 'java/lang/String'), Env->NewString(Env, NULL, 0));
    
    // Заполняем аргументы (логин, сессия и т.д.):
    Arguments[0] = '--username';
    Arguments[1] = 'Player';
    Arguments[2] = '--accessToken';
    Arguments[3] = '12345';
    Env->SetObjectArrayElement(Env, JavaObjectArray, 0, Env->NewString(Env, &Arguments[0]), strlen(Arguments[0]));
    Env->SetObjectArrayElement(Env, JavaObjectArray, 1, Env->NewString(Env, &Arguments[1]), strlen(Arguments[1]));
    Env->SetObjectArrayElement(Env, JavaObjectArray, 2, Env->NewString(Env, &Arguments[2]), strlen(Arguments[2]));
    Env->SetObjectArrayElement(Env, JavaObjectArray, 3, Env->NewString(Env, &Arguments[3]), strlen(Arguments[3]));
    
    Всё это надо организовать в цикле.
    P.S.: Не знаешь случайно, как корректно выгрузить JVM для её повторного запуска и как сделать так, чтобы когда завершается кубач, не завершался процесс, в контексте которого он работает?
     
  3. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    Странно...я пытался поставить туда только 1 аргумент таким вот образом:
    Код:
    env->SetObjectArrayElement(ar, 0, env->NewStringUTF("--tweakClass brb.fml.launcher..."));
    Все равно не запускалось..... Попробую сделать как ты подсказал...
    может быть Attach/DetachCurrentThread ?
     
  4. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    В том и проблема, что нельзя в одном аргументе всё передавать.

    Не помогает. Пробовал DetachCurrentThread, затем DestroyJavaVM - не помогает, при повторном запуске ловлю JNI_ERR (-1).
     
  5. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    Так наверное не нужно уничтожать vm, ведь вместе с ней уничтожится и её процесс, просто удалить текущий поток, а когда нужно будет создать новый?
    Also, сделал все как вы сказали, игра запустилась, но... классы не проходят проверку:

    ...
    [01:23:19] [main/ERROR]: There is a binary discrepency between the expected input class bsz (bsz) and the actual class. Checksum on disk is 32f66091, in patch 2a5b19d0. Things are probably about to go very wrong. Did you put something into the jar file?
    ...
    [01:23:20] [main/ERROR]: The minecraft jar file:/C:/ezcraft/Public/bin/versions/minecraft.jar!/net/minecraft/client/ClientBrandRetriever.class appears to be corrupt! There has been CRITICAL TAMPERING WITH MINECRAFT, it is highly unlikely minecraft will work! STOP NOW, get a clean copy and try again!

    [01:23:20] [main/ERROR]: FML has been ordered to ignore the invalid or missing minecraft certificate. This is very likely to cause a problem!

    [01:23:20] [main/ERROR]: Technical information: ClientBrandRetriever was at jar:file:/C:/ezcraft/Public/bin/versions/minecraft.jar!/net/minecraft/client/ClientBrandRetriever.class, there were 0 certificates for it
     
  6. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Добавь 2 аргумента:
    -Dfml.ignoreInvalidMinecraftCertificates=true
    -Dfml.ignorePatchDiscrepancies=true
     
  7. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    добавлены в vm_args, нужно в аргументы для main?
     
  8. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Нет, их добавляешь именно как аргументы JVM
     
  9. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    ну, я это и имел ввиду:
    Код:
            opt[6].optionString = "-Dfml.ignoreInvalidMinecraftCertificates=true";
            opt[7].optionString = "-Dfml.ignorePatchDiscrepancies=true";
    только оно не работает хд
     
  10. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    А должно... Делаю именно так и у меня работает.
     
  11. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    ignoreUnrecognized должно стоять на true/1 или false/0 ?
     
  12. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Эм, что за ignoreUnrecognized? Откуда взял?
     
  13. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    JavaVMInitArgs
     
  14. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Хз, у меня ничего такого нет. Сразу передаём -Xms/-Xmx, затем -Djava.class.path, -Djava.library.path, затем два Dfml'a (которые выше), а дальше идут аргументы самого кубача (логин, сессия и т.д.).

    12-04-2015 15-29-12.png
     
  15. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    JavaVMInitArgs это в C структура аргументов для начальной инициализации JVM
    Код:
            JavaVMInitArgs vm_args;
            JavaVMOption *opt = new JavaVMOption[8];
            vm_args.version = JNI_VERSION_1_6;
            opt[0].optionString = (char *)malloc(8192); // 8192 cuz too much libs -.-
            opt[3].optionString = (char *)malloc(128);
            opt[4].optionString = (char *)malloc(128);
            opt[5].optionString = (char *)malloc(128);
    
            strncpy(opt[0].optionString, QString("-Djava.class.path=%1").arg(libs).toLocal8Bit().data(), 8192);
            opt[1].optionString = "-verbose:jni";
            opt[2].optionString = "-Djava.compiler=NONE";
            strncpy(opt[3].optionString, QString("-Djava.library.path=%1").arg(Settings::MinecraftFolder + "Public/natives").toLocal8Bit().data(), 128);
            strncpy(opt[4].optionString, QString("-Dorg.lwjgl.librarypath=%1").arg(Settings::MinecraftFolder + "Public/natives").toLocal8Bit().data(), 128);
            strncpy(opt[5].optionString, QString("-Dnet.java.games.input.librarypath=%1").arg(Settings::MinecraftFolder + "Public/natives").toLocal8Bit().data(), 128);
            opt[6].optionString = "-Dfml.ignoreInvalidMinecraftCertificates=true";
            opt[7].optionString = "-Dfml.ignorePatchDiscrepancies=true";
    
            vm_args.options = opt;
            vm_args.nOptions = 8;
            vm_args.ignoreUnrecognized = 1;
    
            int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
            free(opt[0].optionString);
            free(opt[3].optionString);
            free(opt[4].optionString);
            free(opt[5].optionString);
            delete opt;
     
  16. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Понял, про что ты. У меня в false стоит. Почему у тебя такие странные аргументы: -Dnet и -Dorg-, зачем они нужны?
     
  17. Автор темы
    EpicLoyd

    EpicLoyd Активный участник

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    честно.... незнаю.... аргументы для запуска беру из сашка :|
    не думаю что ошибка выше связана с тем, что я поставил лишние переменные :)
     
  18. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Лучше напиши по-честному, с аргументами, значение которых ты знаешь. Эти 2 аргумента - совершенно лишние и одному сашку известно, зачем он их туда воткнул. И даже если ошибка и не в них (а скорей всего именно так и есть), от греха подальше их лучше убрать.
     
  19. log_inil

    log_inil Активный участник Пользователь

    Баллы:
    88
    Дабы не создавать новый топик, спрошу у вас (вы ведь на Дэлфи пишете)..
    В чем проблема?? любой проект с TServerSocket.. валится с такой ошибкой
    Access violation at adress 005DB5E0 in module 'Project1.exe'. Read of address 00000040.
    upload_2015-4-12_18-1-16.png
    Извиняюсь... Огородами оказывается надо ходить... забыл про это..
    upload_2015-4-12_18-11-20.png upload_2015-4-12_18-11-34.png upload_2015-4-12_18-13-5.png
    Профэйспамил....
     
  20. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    В первом случае ты забыл создать сам объект:
    Код:
    var
      ServerSocket: TServerSocket;
    begin
      ServerSocket := TServerSocket.Create(nil); // <---
      ServerSocket.Active := False;
      ServerSocket.Name := 'TestServerSocket';
      ServerSocket.Port := 22500;
      ServerSocket.ServerType := stNonBlocking;
    end;
    
     

Поделиться этой страницей