#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);
}