DLLEXPORT bool GameDLLInit( ModuleImportExport ie, int argc, char* argv[] ) { // set engine singleton pointers CApplication::SetSingletonPtr( ( CApplication * )ie.app ); CAppLog::SetSingletonPtr( ie.app->log ); CNetwork::SetSingletonPtr( ie.app->network ); CScript* script = new CScript(); IC_MainConsole* console = new IC_MainConsole(); // CONSOLE.add( "Game DLL initialized." ); //change working directory to mod changeWorkingDir( APP.modDir ); CONSOLE.addx( "Changing game working directory to '%s%s'", APP.appDir.c_str(), APP.modDir.c_str() ); // create the Game new CGame(); // create other objects CGameServer* serverProcess = new CGameServer(); #ifdef _CLIENT CGameClient* clientProcess = new CGameClient(); #endif // return singleton pointers ModuleImportExport ex; ex.app = CGame::GetSingletonPtr(); ex.serverGameProcess = serverProcess; #ifdef _CLIENT ex.clientGameProcess = clientProcess; #endif APP.ImportDLLPointers( ex ); // run it! CGame::GetSingleton().Run( argc, argv ); // destroy created objects delete CGame::GetSingletonPtr(); delete serverProcess; #ifdef _CLIENT delete clientProcess; #endif //change working directory to apps changeWorkingDir( APP.appDir ); //clean up any remaining unreleased objects IMMObject::CollectRemainingObjects( ( bool )APP.DebugMode ); delete script; delete console; return true; }
void CApplication::Run( int argc, char* argv[] ) { startupError = 0; buildName = ENGINE_NAME; buildName += " (build: "; buildName += MakeBuildNumber( __DATE__ ); buildName += " version: "; buildName += ENGINE_VERSION; buildName += ")"; // get and set the working directory appDir = getDirectoryFromArgs( argc, argv ); changeWorkingDir( appDir ); //open logfiles log = new CAppLog( "Logs/app.txt", true ); APPLOG.Write( wide2string( buildName ).c_str() ); //create a couple of singletons network = new CNetwork(); if ( argc > 1 ) { modDir = argv[1]; } else { modDir = DEFAULT_MODDIR; } modDir += "/"; //load and run the game String dllFile = modDir; dllFile += GAME_MODULE; if ( !LoadGameDLL( dllFile.c_str(), argc, argv ) ) { startupError = ERROR_DLL_NOTLOADED; APPLOG.Write( "Could not load game module %s", dllFile.c_str() ); } // no script and console at this point for ( int i = 0; i < modules.size(); i++ ) { if ( modules[i] ) { FreeLibrary( ( HMODULE )modules[i] ); } } //clean up singletons delete network; if ( startupError > 0 ) { getchar(); } }
void* launchVM(void* params) { std::string execDir = getExecutableDir(); std::ifstream configFile; configFile.open((execDir + std::string("/config.json")).c_str()); printf("config file: %s\n", (execDir + std::string("/config.json")).c_str()); picojson::value json; configFile >> json; std::string err = picojson::get_last_error(); if(!err.empty()) { printf("Couldn't parse json: %s\n", err.c_str()); } std::string jarFile = execDir + std::string("/") + json.get<picojson::object>()["jar"].to_str(); std::string main = json.get<picojson::object>()["mainClass"].to_str(); std::string classPath = std::string("-Djava.class.path=") + jarFile; picojson::array vmArgs = json.get<picojson::object>()["vmArgs"].get<picojson::array>(); printf("jar: %s\n", jarFile.c_str()); printf("mainClass: %s\n", main.c_str()); JavaVMOption* options = (JavaVMOption*)malloc(sizeof(JavaVMOption) * (1 + vmArgs.size())); options[0].optionString = (char*)classPath.c_str(); for(unsigned i = 0; i < vmArgs.size(); i++) { options[i+1].optionString = (char*)vmArgs[i].to_str().c_str(); printf("vmArg %d: %s\n", i, options[i+1].optionString); } JavaVMInitArgs args; args.version = JNI_VERSION_1_6; args.nOptions = 1 + (int)vmArgs.size(); args.options = options; args.ignoreUnrecognized = JNI_FALSE; JavaVM* jvm = 0; JNIEnv* env = 0; #ifndef WINDOWS #ifdef MACOSX std::string jre = execDir + std::string("/jre/lib/server/libjvm.dylib"); #elif defined(__LP64__) std::string jre = execDir + std::string("/jre/lib/amd64/server/libjvm.so"); #else std::string jre = execDir + std::string("/jre/lib/i386/server/libjvm.so"); #endif printf("jre: %s\n", jre.c_str()); void* handle = dlopen(jre.c_str(), RTLD_LAZY); if(handle == NULL) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM)dlsym(handle, "JNI_CreateJavaVM"); if(ptrCreateJavaVM == NULL) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } #else HINSTANCE hinstLib = LoadLibrary(TEXT("jre\\bin\\server\\jvm.dll")); PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM)GetProcAddress(hinstLib,"JNI_CreateJavaVM"); #endif if(!changeWorkingDir(execDir)) { printf("Couldn't change working directory to: %s\n", execDir.c_str()); } jint res = ptrCreateJavaVM(&jvm, (void**)&env, &args); if(res < 0) { fprintf(stderr, "Failed to create Java VM\n"); exit(EXIT_FAILURE); } jobjectArray appArgs = env->NewObjectArray(g_argc, env->FindClass("java/lang/String"), NULL); for(int i = 0; i < g_argc; i++) { jstring arg = env->NewStringUTF(g_argv[i]); env->SetObjectArrayElement(appArgs, i, arg); } jclass mainClass = env->FindClass(main.c_str()); jmethodID mainMethod = env->GetStaticMethodID(mainClass, "main", "([Ljava/lang/String;)V"); if(mainMethod == 0) { fprintf(stderr, "Failed to aquire main() method of class: %s:\n", main.c_str()); exit(EXIT_FAILURE); } env->CallStaticVoidMethod(mainClass, mainMethod, appArgs); jvm->DestroyJavaVM(); return 0; }
/* * RunBuiltInCmd * * arguments: * commandT *cmd: the command to be run * * returns: none * * Runs a built-in command. */ static void RunBuiltInCmd(commandT* cmd) { if(strcmp(cmd->argv[0],"cd")==0){ changeWorkingDir(cmd->argv[1]); } /* "pwd" command*/ else if(strcmp(cmd->argv[0],"pwd")==0){ char *dir = getCurrentWorkingDir(); printf("%s\n",dir); free(dir); } else if(!strcmp(cmd->argv[0],"jobs")){ bgjobL* job = bgjobs; while (job != NULL){ if (!strcmp(job->status, "Running")){ printf("[%d] %s %s &\n", job->jid, job->status, job->name); } else{ printf("[%d] %s %s\n", job->jid, job->status, job->name); } job = job->next; } } else if (!strcmp(cmd->argv[0],"fg")){ bgjobL* job; if(cmd->argv[1] != NULL){ job = GetJobFromJid(atoi(cmd->argv[1])); } else{ job = GetMRJob(); } //bring bg process to foreground if (job != NULL){ tcsetpgrp(job->pid, STDIN_FILENO); crpid = job->pid; crName = job->name; DeleteJob(job->pid); kill(-crpid, SIGCONT); int status = 0; waitpid(crpid, &status, WUNTRACED); crpid = 0; crName = NULL; } } else if (!strcmp(cmd->argv[0],"bg")){ bgjobL* job; if(cmd->argv[1] != NULL){ job = GetJobFromJid(atoi(cmd->argv[1])); if (job != NULL){ kill(job->pid, SIGCONT); job->status = "Running"; } } else{ job = GetMRJob(); if (job != NULL){ kill(job->pid, SIGCONT); job->status = "Running"; } } } else if(!strcmp(cmd->argv[0],"alias")){ addAlias(cmd); } else if(!strcmp(cmd->argv[0],"unalias")){ deleteAlias(cmd->argv[1]); } else if(!strcmp(cmd->argv[0],"exit")){ return; } } /* RunBuiltInCmd */