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

Лаунчер с JNI

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

  1. log_inil

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

    Баллы:
    88
    Спасиб
     
  2. Автор темы
    EpicLoyd

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

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    i'm back, убрал те 2 аргумента, ошибки с проверкой классов все равно лезут хд
     
  3. HoShiMin

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

    Баллы:
    173
    Это ты ко мне в скайпе добавлялся?
    Вот заведомо рабочая функция, которой достаточно передать массивы параметров:
    Код:
    // JNIWrapper.cpp: определяет экспортированные функции для приложения DLL.
    //
    
    #include "stdafx.h"
    
    #include "jni.h"
    #include "windows.h"
    
    typedef jint(JNICALL *JNI_CREATEJAVAVM)(JavaVM **, JNIEnv **, void *);
    JNI_CREATEJAVAVM jni_JNI_CreateJavaVM = NULL;
    
    static JavaVM* JVM = NULL;
    static JNIEnv* JNIEnvironment = NULL;
    
    enum RETURN_VALUES {
        JNIWRAPPER_LIBRARY_NOT_FOUND,
        JNIWRAPPER_FUNCTION_NOT_FOUND,
    
        JNIWRAPPER_SUCCESS,
        JNIWRAPPER_UNKNOWN_ERROR,
        JNIWRAPPER_JNI_INVALID_VERSION,
        JNIWRAPPER_NOT_ENOUGH_MEMORY,
        JNIWRAPPER_JVM_ALREADY_EXISTS,
        JNIWRAPPER_INVALID_ARGUMENTS,
       
        JNIRAPPER_CLASS_NOT_FOUND,
        JNIWRAPPER_METHOD_NOT_FOUND,
       
    };
    
    
    extern "C" __declspec (dllexport)
    ULONG __stdcall LaunchJavaApplet(LPTSTR JVMPath, int JNI_VERSION, int JVMOptionsCount, char* JVMOptions[], char* MainClass, int ArgumentsCount, char* Arguments[])
    {
        // Загружаем библиотеку:
        HMODULE hJVM = GetModuleHandle(JVMPath);
        if (hJVM == 0) {
            hJVM = LoadLibrary(JVMPath);
            if (hJVM == 0) {
                return JNIWRAPPER_LIBRARY_NOT_FOUND;
            }
        }
    
        // Импортируем функцию:
        jni_JNI_CreateJavaVM = (JNI_CREATEJAVAVM)GetProcAddress(hJVM, "JNI_CreateJavaVM");
        if (jni_JNI_CreateJavaVM == 0) {
            return JNIWRAPPER_FUNCTION_NOT_FOUND;
        }
    
    
        // Заполняем массив параемтров JVM:
        JavaVMOption *Options = new JavaVMOption[JVMOptionsCount];
        for (int i = 0; i < JVMOptionsCount; i++) {
            Options[i].optionString = (char*)(JVMOptions[i]);
        }
    
        //Формируем опции запуска виртуальной машины:
        JavaVMInitArgs JVMArgs;
        JVMArgs.options = Options;
        JVMArgs.nOptions = JVMOptionsCount;
        JVMArgs.ignoreUnrecognized = FALSE;
        JVMArgs.version = JNI_VERSION;
    
        //Вызываем функцию JNI_CreateJavaVM из dll адресс которой получили ранее:
        int Response = jni_JNI_CreateJavaVM(&JVM, &JNIEnvironment, &JVMArgs);
    
        delete Options;
    
        // Проверяем, успешно ли запустилась JVM:
        if (Response != JNI_OK) {
            switch (Response) {
            case JNI_ERR:
                return JNIWRAPPER_UNKNOWN_ERROR;
            case JNI_EVERSION:
                return JNIWRAPPER_JNI_INVALID_VERSION;
            case JNI_ENOMEM:
                return JNIWRAPPER_NOT_ENOUGH_MEMORY;
            case JNI_EEXIST:
                return JNIWRAPPER_JVM_ALREADY_EXISTS;
            case JNI_EINVAL:
                return JNIWRAPPER_INVALID_ARGUMENTS;
            }
        }
    
        // Ищем нужный класс:
        jclass LaunchClass = JNIEnvironment->FindClass(MainClass);
        if (LaunchClass == 0) {
            return JNIRAPPER_CLASS_NOT_FOUND;
        }
    
        // Ищем нужный метод и задаём ему аргументы:
        jmethodID JavaMethodID = JNIEnvironment->GetStaticMethodID(LaunchClass, "main", "([Ljava/lang/String;)V");
        if (JavaMethodID == 0) {
            return JNIWRAPPER_METHOD_NOT_FOUND;
        }
    
    
        // Создаём массив с аргументами:
        jobjectArray JavaObjectArray = JNIEnvironment->NewObjectArray(ArgumentsCount, JNIEnvironment->FindClass("java/lang/String"), JNIEnvironment->NewStringUTF(""));
    
        // Заполняем массив:
        if (ArgumentsCount > 0) {
            for (int i = 0; i < ArgumentsCount; i++) {
                JNIEnvironment->SetObjectArrayElement(JavaObjectArray, i, JNIEnvironment->NewStringUTF((Arguments[i])));
            }
        }
    
        // Запускаем метод:
        JNIEnvironment->CallStaticVoidMethod(LaunchClass, JavaMethodID, JavaObjectArray);
        return JNIWRAPPER_SUCCESS;
    }
    
    
    И в аттаче архив с двумя собранными либами (под х32 и х64) и исходники.
     

    Вложения:

    • JNIWrapper.zip
      Размер файла:
      29,4 КБ
      Просмотров:
      12
  4. Автор темы
    EpicLoyd

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

    Баллы:
    61
    Skype:
    allexboris
    Имя в Minecraft:
    StackGuard
    Не поверишь, но все абсолютно также :D ( Кроме загрузки библиотеки, она у меня динамическая )
    Нет, но сейчас добавлю, ибо через форум неудобно хд
     

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