Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
  • Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Способ запуска клиента игры из Лаунчера Часть 2

@Racvol, есть пара вопросов:
Если ли какие-то способы подменить сессию в момент изменения переменной в машине Java? (Я не говорю о редактировании переменной уже после передачи сессии лаунчером)
Есть ли какие-то особенности запуска версий MC старше 1.5.2?
Сессию всегда можно перехватить при обращении клиента к серверу и подставить в батник независимо зашифрована она или нет
Только если шифрование клиента и сервера не изменено
 
Сессию всегда можно перехватить при обращении клиента к серверу и подставить в батник независимо зашифрована она или нет
Только если шифрование клиента и сервера не изменено

Шифрование трафика?
 
Sirse, я так и не понял что за момент изменения переменной в машине Java, однако как тут и говорили сессию можно перехватить снифером если трафик не шифрован, после того как сессию передали JavaVM ее можно перехватить если клиент взломан.
Начиная с версии 1.5.2 запускать клиент стало... хм иначе.
1) minecraft.jar переместился в папку versions\{version} и переименовался в {version}.jar например 1.7.2.jar
2) нативные библиотеки динамически создаются в папке versions\{version} с рандомным именем
3) библиотеки классов находятся в \libraries, и каждая по своему собственному пути
4) библиотеки классов могут отсутствовать после установки minecraft, какие библиотеки нужно подгружать и откуда находятся в versions\{version}\{version}.json

Вот пример запуска 1.7.2 с установленным Forge на С++
PHP:
#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* env = NULL;

extern "C" __declspec(dllexport)
void __cdecl  CreateMinecraftGame(LPTSTR jvmPath, LPSTR optionString0, LPSTR optionString1, LPSTR optionString2)
{
    //char* jvmPath = "C:\\Users\\Admin\\Documents\\visual studio 2013\\Projects\\Launcher\\Launcher\\bin\\x64\\Debug\\jre7\\bin\\server\\jvm.dll";
    //char* optionString0 = -Xmx2G -Dfml.ignorePatchDiscrepancies=true -Dfml.ignoreInvalidMinecraftCertificates=true
    //char* optionString1 =
    //    "-Djava.class.path=C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\net\\minecraft\\launchwrapper\\1.9\\launchwrapper-1.9.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\net\\minecraftforge\\forge\\1.7.2-10.12.0.971\\forge-1.7.2-10.12.0.971.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\ow2\\asm\\asm-all\\4.1\\asm-all-4.1.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\scala-lang\\scala-library\\2.10.2\\scala-library-2.10.2.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\scala-lang\\scala-compiler\\2.10.2\\scala-compiler-2.10.2.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\java3d\\vecmath\\1.3.1\\vecmath-1.3.1.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\net\\sf\\trove4j\\trove4j\\3.0.3\\trove4j-3.0.3.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\ibm\\icu\\icu4j-core-mojang\\51.2\\icu4j-core-mojang-51.2.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\net\\sf\\jopt-simple\\jopt-simple\\4.5\\jopt-simple-4.5.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\lzma\\0.0.1\\lzma-0.0.1.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\paulscode\\codecjorbis\\20101023\\codecjorbis-20101023.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\paulscode\\codecwav\\20101023\\codecwav-20101023.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\paulscode\\libraryjavasound\\20101123\\libraryjavasound-20101123.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\paulscode\\librarylwjglopenal\\20100824\\librarylwjglopenal-20100824.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\paulscode\\soundsystem\\20120107\\soundsystem-20120107.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\io\\netty\\netty-all\\4.0.10.Final\\netty-all-4.0.10.Final.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\google\\guava\\guava\\15.0\\guava-15.0.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\apache\\commons\\commons-lang3\\3.1\\commons-lang3-3.1.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\commons-io\\commons-io\\2.4\\commons-io-2.4.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\net\\java\\jinput\\jinput\\2.0.5\\jinput-2.0.5.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\net\\java\\jutils\\jutils\\1.0.0\\jutils-1.0.0.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\google\\code\\gson\\gson\\2.2.4\\gson-2.2.4.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\com\\mojang\\authlib\\1.3\\authlib-1.3.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-api\\2.0-beta9\\log4j-api-2.0-beta9.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\apache\\logging\\log4j\\log4j-core\\2.0-beta9\\log4j-core-2.0-beta9.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl\\2.9.0\\lwjgl-2.9.0.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\org\\lwjgl\\lwjgl\\lwjgl_util\\2.9.0\\lwjgl_util-2.9.0.jar;"
    //    "C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\libraries\\1.7.2-Forge10.12.0.976\\1.7.2-Forge10.12.0.976.jar";
    //char* optionString2 = "-Djava.library.path=C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\versions\\1.7.2-Forge10.12.0.976\\1.7.2-Forge10.12.0.976-natives";

    HMODULE hJvm = ::LoadLibrary(jvmPath); // Загружаем jvm.dll
    jni_JNI_CreateJavaVM = (JNI_CREATEJAVAVM)GetProcAddress(hJvm, "JNI_CreateJavaVM"); //Получаем адреес функции в dll

    JavaVMOption options[3];
    options[0].optionString = optionString0;
    options[1].optionString = optionString1;
    options[2].optionString = optionString2;

    //Формируем опции запуска виртуальной машины
    JavaVMInitArgs args;
    args.options = options;
    args.nOptions = 3; // Количество опций
    args.ignoreUnrecognized = FALSE;
    args.version = JNI_VERSION_1_6;


    //Вызываем функцию JNI_CreateJavaVM из dll адресс которой получили ранее
    jni_JNI_CreateJavaVM(&jvm, &env, &args);


    //Forge 1.7.2 вызываем main функцию класса net.minecraft.launchwrapper.Launch
    jclass class_Launch = env->FindClass("net/minecraft/launchwrapper/Launch");

    jmethodID mid = env->GetStaticMethodID(class_Launch, "main", "([Ljava/lang/String;)V");
    jobjectArray str_array = env->NewObjectArray(12, env->FindClass("java/lang/String"), env->NewStringUTF(""));
    env->SetObjectArrayElement(str_array, 0, env->NewStringUTF("--username"));
    env->SetObjectArrayElement(str_array, 1, env->NewStringUTF("Player"));
    env->SetObjectArrayElement(str_array, 2, env->NewStringUTF("--version"));
    env->SetObjectArrayElement(str_array, 3, env->NewStringUTF("1.7.2-Forge10.12.0.976"));
    env->SetObjectArrayElement(str_array, 4, env->NewStringUTF("--gameDir"));
    env->SetObjectArrayElement(str_array, 5, env->NewStringUTF("C:\\Users\\Admin\\AppData\\Roaming\\.minecraft"));
    env->SetObjectArrayElement(str_array, 6, env->NewStringUTF("--assetsDir"));
    env->SetObjectArrayElement(str_array, 7, env->NewStringUTF("C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\assets\\virtual\\legacy"));
    env->SetObjectArrayElement(str_array, 8, env->NewStringUTF("--accessToken"));
    env->SetObjectArrayElement(str_array, 9, env->NewStringUTF("0"));
    env->SetObjectArrayElement(str_array, 10, env->NewStringUTF("--tweakClass"));
    env->SetObjectArrayElement(str_array, 11, env->NewStringUTF("cpw.mods.fml.common.launcher.FMLTweaker"));

    env->CallStaticVoidMethod(class_Launch, env->GetStaticMethodID(class_Launch, "main", "([Ljava/lang/String;)V"), str_array);
}

Я закоментировал что передается в параметрах метода.
По поводу нативных библиотек которое создаются динамически, я создал папку по пути versions\{version}\{version}-natives разархивировал туда нативные библиотеки и подгрузил с помощь строки
PHP:
-Djava.library.path=C:\\Users\\Admin\\AppData\\Roaming\\.minecraft\\versions\\1.7.2-Forge10.12.0.976\\1.7.2-Forge10.12.0.976-natives
Сами нативные библиотеки находятся в
libraries\net\java\jinput\jinput-platform и
libraries\org\lwjgl\lwjgl\lwjgl-platform
 
Последнее редактирование:
уточняю, каким образом?
На C# у меня например, шифрование трафика оболочкой лаунчера идёт, и передаёт расшифрованную сесию в майнкрафт. Пока организовываю рандомный таймер, который будет через случайное время посылать запросы авторизации, и счётчик неудачных запросов(от 2 до 5 запросов оболочка лаунчера может не получить потом происходит блокировка, либо кикнет с сервера, либо принудительно будет остановлена ява машина. ). На С++ такое организовать тоже не сложно. Самое проблемотичное было и пока не до конца работает, это шифрование. Слишком много косяков. Но уже школьник не сможет перехватить сессию, алгоритм шифрования достаточно надёжный. и без знания ключа, его долго вскрывать придётся. Проще разлопатить код. Подставить перехваченный код тоже не выйдет, тем же рандомным таймером меняется ключ, после первого запуска.
 
На C# у меня например, шифрование трафика оболочкой лаунчера идёт, и передаёт расшифрованную сесию в майнкрафт. Пока организовываю рандомный таймер, который будет через случайное время посылать запросы авторизации, и счётчик неудачных запросов(от 2 до 5 запросов оболочка лаунчера может не получить потом происходит блокировка, либо кикнет с сервера, либо принудительно будет остановлена ява машина. ). На С++ такое организовать тоже не сложно. Самое проблемотичное было и пока не до конца работает, это шифрование. Слишком много косяков. Но уже школьник не сможет перехватить сессию, алгоритм шифрования достаточно надёжный. и без знания ключа, его долго вскрывать придётся. Проще разлопатить код. Подставить перехваченный код тоже не выйдет, тем же рандомным таймером меняется ключ, после первого запуска.

Непосредственно сам клиент при обращении к серверу отправляет ему Get запрос, который легко перехватить, к примеру HTTPAnalyzer. В нем будет логин и сессия, которая вставляется в батник и запускается клиент с читами.
Если в классе майнкрафт вы не делали изменений, то сессия легко переватывается.
Также шифрование можно сделать через прокси подключение.
Начиная с версии 1.5.2 запускать клиент стало... хм иначе.
поправка, 1.5.2 еще старый запуск
 
Всё соединение идёт через некое подобие сокета, через пхп скрипт, как в стандартном лаунчере на ява с небольшой правкой, на сервере, и самим лаунчером в нутре которого запустилась ява машина. Так что вполне устойчивый канал шифрования. Защита хоть и нубская, но школьников поставит в ступор. Более или менее разбирающиеся, шифрование вскроют. Причина прозаична. Так что хоть и простая схема ваши анализаторы покажут фигу. Ибо запрос на подключение пройдёт только после получения второй части ключа для шифрования от сервера. Что плохо, нагрузка на сервер существенная. Каждое соединение это лишняя нагрузка, поэтому и сам метод шифрования пока самый простой и быстрый.
Если бы кто посоветовал какую хорошую книгу почитать о том как делать шифрование на C#, был бы благодарен.
В любом случае самый перспективный способ делать лаунчеры, это писать их на нормальных языках программирования, а не на яве.

ЗЫ Как только сделаю стабильную версию, если это когда нибудь произойдёт, то скину сюда в халявные лаунчеры. :)
 
Последнее редактирование:
Ты лучше код сразу выкладывай чтобы его можно было покритиковать
 
На чем лучше писать лаунчер? У меня диллема, лаунчер не только для майна, но и для других игр, есть вариант писать на c++ с помощью qt или на java. Что лучше, эффективней, быстрей и проще?
 
На чем лучше писать лаунчер? У меня диллема, лаунчер не только для майна, но и для других игр, есть вариант писать на c++ с помощью qt или на java. Что лучше, эффективней, быстрей и проще?

Проще - Java. Лучше, эффективней и быстрей - си/делфи.
Ну и ассемблер.

@Racvol, вы где-то писали что экспериментировали с запуском JNI в C#, не поделитесь наработками?
 
Проще - Java. Лучше, эффективней и быстрей - си/делфи.
Ну и ассемблер.

@Racvol, вы где-то писали что экспериментировали с запуском JNI в C#, не поделитесь наработками?
Ассемблер? Нет, наша жизнь слишком коротка, пожалуй выберу c++ и фреймворк qt
 
Эта страница еще поддерживается автором? Если да, то можно узнать как запускать 1.7.5?:creeper:
Ребят, что бы найти jni.h надо скачать JRE! (Я сам тупил:eek:)(Для тех кому лень искать в теме)
На чем лучше писать лаунчер? У меня диллема, лаунчер не только для майна, но и для других игр, есть вариант писать на c++ с помощью qt или на java. Что лучше, эффективней, быстрей и проще?
Привет, единомышленник по лаунчером, советую C++. Почему? Ответ прост: Java код можно изменить через InClassTranslator.
ТС! Хватит спать! Мне надоело уже разбираться с косяками 1.7.5!
 
Так с forge сложнее было на тот момент, щас все проще что с forge что с ванила, просто фигачиш подготовленный массив строк в main функцию
Ни чего ни понял:confused:
ТС, ты тут?! Обновляй тему =) Буду по твоему уроку видеоурок пилить.(Так и не понял как запустить:confused:)
Код:
typedef jint(JNICALL *JNI_CREATEJAVAVM)(JavaVM **, JNIEnv **, void *);
JNI_CREATEJAVAVM jni_JNI_CreateJavaVM = NULL;

static JavaVM* jvm = NULL;
static JNIEnv* env = NULL;

void CreateMinecraftGame(LPTSTR jvmPath, LPSTR optionString0, LPSTR optionString1, LPSTR optionString2)
{
    char* jvmPath = "C:\\MLS_Client\\JNI_Files\\jvm.dll";
    char* optionString0 = "-Xmx1G -Dfml.ignorePatchDiscrepancies=true -Dfml.ignoreInvalidMinecraftCertificates=true";
    char* optionString1 =
        "-Djava.class.path=C:\\MLS_Client\\libraries\\net\\minecraft\\launchwrapper\\1.9\\launchwrapper-1.9.jar;"
        "C:\\MLS_Client\\libraries\\net\\minecraftforge\\forge\\1.7.2-10.12.0.971\\forge-1.7.2-10.12.0.971.jar;"
        "C:\\MLS_Client\\libraries\\org\\ow2\\asm\\asm-all\\4.1\\asm-all-4.1.jar;"
        "C:\\MLS_Client\\libraries\\org\\scala-lang\\scala-library\\2.10.2\\scala-library-2.10.2.jar;"
        "C:\\MLS_Client\\libraries\\org\\scala-lang\\scala-compiler\\2.10.2\\scala-compiler-2.10.2.jar;"
        "C:\\MLS_Client\\libraries\\java3d\\vecmath\\1.3.1\\vecmath-1.3.1.jar;"
        "C:\\MLS_Client\\libraries\\net\\sf\\trove4j\\trove4j\\3.0.3\\trove4j-3.0.3.jar;"
        "C:\\MLS_Client\\libraries\\com\\ibm\\icu\\icu4j-core-mojang\\51.2\\icu4j-core-mojang-51.2.jar;"
        "C:\\MLS_Client\\libraries\\net\\sf\\jopt-simple\\jopt-simple\\4.5\\jopt-simple-4.5.jar;"
        "C:\\MLS_Client\\libraries\\lzma\\0.0.1\\lzma-0.0.1.jar;"
        "C:\\MLS_Client\\libraries\\com\\paulscode\\codecjorbis\\20101023\\codecjorbis-20101023.jar;"
        "C:\\MLS_Client\\libraries\\com\\paulscode\\codecwav\\20101023\\codecwav-20101023.jar;"
        "C:\\MLS_Client\\libraries\\com\\paulscode\\libraryjavasound\\20101123\\libraryjavasound-20101123.jar;"
        "C:\\MLS_Client\\libraries\\com\\paulscode\\librarylwjglopenal\\20100824\\librarylwjglopenal-20100824.jar;"
        "C:\\MLS_Client\\libraries\\com\\paulscode\\soundsystem\\20120107\\soundsystem-20120107.jar;"
        "C:\\MLS_Client\\libraries\\io\\netty\\netty-all\\4.0.10.Final\\netty-all-4.0.10.Final.jar;"
        "C:\\MLS_Client\\libraries\\com\\google\\guava\\guava\\15.0\\guava-15.0.jar;"
        "C:\\MLS_Client\\libraries\\org\\apache\\commons\\commons-lang3\\3.1\\commons-lang3-3.1.jar;"
        "C:\\MLS_Client\\libraries\\commons-io\\commons-io\\2.4\\commons-io-2.4.jar;"
        "C:\\MLS_Client\\libraries\\net\\java\\jinput\\jinput\\2.0.5\\jinput-2.0.5.jar;"
        "C:\\MLS_Client\\libraries\\net\\java\\jutils\\jutils\\1.0.0\\jutils-1.0.0.jar;"
        "C:\\MLS_Client\\libraries\\com\\google\\code\\gson\\gson\\2.2.4\\gson-2.2.4.jar;"
        "C:\\MLS_Client\\libraries\\com\\mojang\\authlib\\1.3\\authlib-1.3.jar;"
        "C:\\MLS_Client\\libraries\\org\\apache\\logging\\log4j\\log4j-api\\2.0-beta9\\log4j-api-2.0-beta9.jar;"
        "C:\\MLS_Client\\libraries\\org\\apache\\logging\\log4j\\log4j-core\\2.0-beta9\\log4j-core-2.0-beta9.jar;"
        "C:\\MLS_Client\\libraries\\org\\lwjgl\\lwjgl\\lwjgl\\2.9.0\\lwjgl-2.9.0.jar;"
        "C:\\MLS_Client\\libraries\\org\\lwjgl\\lwjgl\\lwjgl_util\\2.9.0\\lwjgl_util-2.9.0.jar;"
        "C:\\MLS_Client\\libraries\\1.7.2-Forge10.12.0.976\\1.7.2-Forge10.12.0.976.jar";
    char* optionString2 = "-Djava.library.path=C:\\MLS_Client\\versions\\1.7.2-Forge10.12.0.976\\1.7.2-Forge10.12.0.976-natives";

    HMODULE hJvm = ::LoadLibrary(jvmPath); // Загружаем jvm.dll
    jni_JNI_CreateJavaVM = (JNI_CREATEJAVAVM)GetProcAddress(hJvm, "JNI_CreateJavaVM"); //Получаем адреес функции в dll

    JavaVMOption options[3];
    options[0].optionString = optionString0;
    options[1].optionString = optionString1;
    options[2].optionString = optionString2;

    //Формируем опции запуска виртуальной машины
    JavaVMInitArgs args;
    args.options = options;
    args.nOptions = 3; // Количество опций
    args.ignoreUnrecognized = FALSE;
    args.version = JNI_VERSION_1_6;


    //Вызываем функцию JNI_CreateJavaVM из dll адресс которой получили ранее
    jni_JNI_CreateJavaVM(&jvm, &env, &args);


    //Forge 1.7.2 вызываем main функцию класса net.minecraft.launchwrapper.Launch
    jclass class_Launch = env->FindClass("net/minecraft/launchwrapper/Launch");

    jmethodID mid = env->GetStaticMethodID(class_Launch, "main", "([Ljava/lang/String;)V");
    jobjectArray str_array = env->NewObjectArray(12, env->FindClass("java/lang/String"), env->NewStringUTF(""));
    env->SetObjectArrayElement(str_array, 0, env->NewStringUTF("--username"));
    env->SetObjectArrayElement(str_array, 1, env->NewStringUTF("Natsu_Zirok"));
    env->SetObjectArrayElement(str_array, 2, env->NewStringUTF("--version"));
    env->SetObjectArrayElement(str_array, 3, env->NewStringUTF("1.7.2-Forge10.12.0.976"));
    env->SetObjectArrayElement(str_array, 4, env->NewStringUTF("--gameDir"));
    env->SetObjectArrayElement(str_array, 5, env->NewStringUTF("C:\\MLS_Client"));
    env->SetObjectArrayElement(str_array, 6, env->NewStringUTF("--assetsDir"));
    env->SetObjectArrayElement(str_array, 7, env->NewStringUTF("C:\\MLS_Client\\assets\\virtual\\legacy"));
    env->SetObjectArrayElement(str_array, 8, env->NewStringUTF("--accessToken"));
    env->SetObjectArrayElement(str_array, 9, env->NewStringUTF("0"));
    env->SetObjectArrayElement(str_array, 10, env->NewStringUTF("--tweakClass"));
    env->SetObjectArrayElement(str_array, 11, env->NewStringUTF("cpw.mods.fml.common.launcher.FMLTweaker"));

    env->CallStaticVoidMethod(class_Launch, env->GetStaticMethodID(class_Launch, "main", "([Ljava/lang/String;)V"), str_array);
}
Выделены(ошибки):
В начале: JNICALL, *JNI_CREATEJAVAVM(Звездочка), JNI_CREATEJAVAVM
В середине: JNI_CREATEJAVAVM, (JNI_CREATEJAVAVM)(Здесь требует ';')GetProcAddress
 
Ты заголовочные файлы то подключил? Или думаешь, что оно само всё найдет и подключит?
 
Ты заголовочные файлы то подключил? Или думаешь, что оно само всё найдет и подключит?
:eek:Да ты КЭП!
*facepalm* Да вот только подключен он.
Безымянный 2.png Безымянный.png
Не учи программиста со стажем в год(Хоть и с маленькими знаниями) программировать.
 
*facepalm* Да вот только подключен он.

Не стоит спорить с тем, кто программирует с 2005го. Не все заголовочные подключил.
Выхода два - либо добавь в проект путь до <твои заголовочные с jdk>\win32
Либо в файле jni.h напрямую смени строку
#include "jni_md.h"
На
#include "win32\jni_md.h"

2014-12-14_12-28_JNITest.jpg
 
Последнее редактирование:

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

Назад
Верх