bool createNewJavaVM( const char* PLUGIN_PATH, JavaVM** jvm, JNIEnv** env ) { char* fileBuffer = (char*)malloc( 16384 ); if ( JAVA_HOME == NULL ) { logg( "ERROR: Could not locate JAVA_HOME." ); return ( false ); } memcpy( fileBuffer, "Using Java from folder \"", 24 ); memcpy( fileBuffer + 24, JAVA_HOME, strlen( JAVA_HOME ) ); memcpy( fileBuffer + 24 + strlen( JAVA_HOME ), "\".", 3 ); logg( fileBuffer ); if(JAVA_VERSION == 7) { getFullPath( JAVA_HOME, "bin\\msvcr100.dll", fileBuffer ); logg( " Loading msvcr100.dll..."); } else { getFullPath( JAVA_HOME, "bin\\msvcr71.dll", fileBuffer ); logg( " Loading msvcr71.dll..."); } HMODULE msvcdll = LoadLibrary( fileBuffer ); if ( msvcdll == NULL ) { if(JAVA_VERSION == 7) logg( " ERROR: Failed to load msvcr100.dll." ); else logg( " ERROR: Failed to load msvcr71.dll." ); return ( false ); } getFullPath( JAVA_HOME, "bin\\client\\jvm.dll", fileBuffer ); logg( " Loading jvm.dll..." ); HMODULE jvmdll = LoadLibrary( fileBuffer ); if ( jvmdll == NULL ) { logg( "ERROR: Failed to load jvm.dll." ); return ( false ); } logg( "Successfully loaded Java dlls." ); logg( "Invoking Java VM..." ); const unsigned int NUM_OPTIONS = 7; JavaVMOption options[NUM_OPTIONS]; setBuffer( "-Djava.class.path=", fileBuffer ); addPostFix( PLUGIN_PATH, fileBuffer ); addPostFix( "\\rfdynhud.jar", fileBuffer ); // TODO: Detect rFactor version somehow! addPostFix( ";", fileBuffer ); addPostFix( PLUGIN_PATH, fileBuffer ); addPostFix( "\\rfdynhud_gamedata_rfactor1.jar", fileBuffer ); addPostFix( ";", fileBuffer ); addPostFix( PLUGIN_PATH, fileBuffer ); addPostFix( "\\editor\\rfdynhud_editor.jar", fileBuffer ); options[0].optionString = cropBuffer2( fileBuffer ); options[1].optionString = cropBuffer2( addPreFix( "-Dworkdir=", setBuffer( PLUGIN_PATH, fileBuffer ) ) ); options[2].optionString = "-Xms512m"; options[3].optionString = "-Xmx512m"; options[4].optionString = "-XX:MaxGCPauseMillis=5"; options[5].optionString = "-XX:+UseAdaptiveSizePolicy"; options[6].optionString = "-Xincgc"; free( fileBuffer ); logg( "JVM options:" ); for ( unsigned int i = 0; i < NUM_OPTIONS; i++ ) { logg2( " " ); logg( options[i].optionString ); } JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 7; vm_args.ignoreUnrecognized = TRUE; CreateJavaVMPROC CreateJavaVM = (CreateJavaVMPROC)GetProcAddress( jvmdll, "JNI_CreateJavaVM" ); if ( CreateJavaVM == NULL ) { logg( "ERROR: Failed to get proc address of JNI_CreateJavaVM." ); return ( false ); } jint res = CreateJavaVM( jvm, (void **)env, &vm_args ); if ( res < 0 ) { logg( "ERROR: Failed to create Java virtual machine." ); return ( false ); } logg( "Successfully invoked Java VM." ); return ( true ); }
bool createNewJavaVM( const char* PLUGIN_PATH, JavaVM** jvm, JNIEnv** env ) { char* fileBuffer = (char*)malloc( 16384 ); if ( JAVA_HOME == NULL ) { logg( "ERROR: Could not locate JAVA_HOME." ); return ( false ); } memcpy( fileBuffer, "Using Java from folder \"", 24 ); memcpy( fileBuffer + 24, JAVA_HOME, strlen( JAVA_HOME ) ); memcpy( fileBuffer + 24 + strlen( JAVA_HOME ), "\".", 3 ); logg( fileBuffer ); if(JAVA_VERSION == 7) { getFullPath( JAVA_HOME, "bin\\msvcr100.dll", fileBuffer ); logg( " Loading msvcr100.dll...", false ); } else { getFullPath( JAVA_HOME, "bin\\msvcr71.dll", fileBuffer ); logg( " Loading msvcr71.dll...", false ); } HMODULE msvcdll = LoadLibrary( fileBuffer ); if ( msvcdll == NULL ) { if(JAVA_VERSION == 7) logg( " ERROR: Failed to load msvcr100.dll." ); else logg( " ERROR: Failed to load msvcr71.dll." ); return ( false ); } else { logg( " done." ); } getFullPath( JAVA_HOME, "bin\\client\\jvm.dll", fileBuffer ); logg( " Loading jvm.dll...", false ); HMODULE jvmdll = LoadLibrary( fileBuffer ); if ( jvmdll == NULL ) { logg( " ERROR: Failed to load jvm.dll." ); return ( false ); } else { logg( " done." ); } logg( "Successfully loaded Java dlls." ); logg( "Invoking Java VM..." ); setBuffer( "-Djava.class.path=", fileBuffer ); addPostFix( PLUGIN_PATH, fileBuffer ); addPostFix( "\\rfdynhud.jar", fileBuffer ); addPostFix( ";", fileBuffer ); addPostFix( PLUGIN_PATH, fileBuffer ); if ( isRFactor2() ) addPostFix( "\\rfdynhud_gamedata_rfactor2.jar", fileBuffer ); else addPostFix( "\\rfdynhud_gamedata_rfactor1.jar", fileBuffer ); const bool WITH_PROFILER = false; const unsigned int nOptions = WITH_PROFILER ? 11 : 10; JavaVMOption options[nOptions]; unsigned int i = 0; options[i++].optionString = cropBuffer2( fileBuffer ); options[i++].optionString = cropBuffer2( addPreFix( "-Dworkdir=", setBuffer( PLUGIN_PATH, fileBuffer ) ) ); options[i++].optionString = "-Xms96m"; options[i++].optionString = "-Xmx96m"; options[i++].optionString = "-XX:MaxGCPauseMillis=5"; options[i++].optionString = "-XX:+UseAdaptiveSizePolicy"; options[i++].optionString = "-Xincgc"; options[i++].optionString = "-Dsun.java2d.opengl=true"; options[i++].optionString = "-Dsun.java2d.d3d=false"; options[i++].optionString = "-Dsun.java2d.noddraw=true"; if ( WITH_PROFILER ) options[i++].optionString = "-agentpath:c:\\Program Files (x86)\\YourKit Java Profiler 9.0.8\\bin\\win32\\yjpagent.dll"; free( fileBuffer ); logg( "JVM options:" ); for ( i = 0; i < nOptions; i++ ) logg2( " ", options[i].optionString, true ); JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = nOptions; vm_args.ignoreUnrecognized = TRUE; CreateJavaVMPROC CreateJavaVM = (CreateJavaVMPROC)GetProcAddress( jvmdll, "JNI_CreateJavaVM" ); if ( CreateJavaVM == NULL ) { logg( "ERROR: Failed to get proc address of JNI_CreateJavaVM." ); return ( false ); } jint res = CreateJavaVM( jvm, (void **)env, &vm_args ); if ( res < 0 ) { logg( "ERROR: Failed to create Java virtual machine." ); return ( false ); } jclass System = (*env)->FindClass( "java/lang/System" ); jmethodID getProperty = (*env)->GetStaticMethodID( System, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;" ); loggSystemProperty( *env, System, getProperty, "java.vm.vendor" ); loggSystemProperty( *env, System, getProperty, "java.vm.name" ); loggSystemProperty( *env, System, getProperty, "java.vm.version" ); loggSystemProperty( *env, System, getProperty, "java.runtime.version" ); loggSystemProperty( *env, System, getProperty, "java.awt.graphicsenv" ); logg( "Successfully invoked Java VM." ); return ( true ); }
void RFDynHUDPlugin2::Error( const char* const msg ) { logg2( "ERROR: ", msg ); }