2015-08-23 2 views
1
JavaVM *jvm; 
JNIEnv *env; 
LoadLibrary(TEXT("jvm.dll")); 
JavaVMInitArgs vm_args; 
vm_args.version=JNI_VERSION_1_6; 
if (uri != NULL) 
{ 
    vm_args.nOptions=l_paramlines; 
} 
else 
{ 
    vm_args.nOptions=l_paramlines-1; 
} 
vm_args.options=new JavaVMOption[vm_args.nOptions]; 
int index=0; 
char* buffer; 
if (uri != NULL) 
{ 
    int bufferLen=512; 
    buffer = new char[bufferLen]; 
    strcpy_s(buffer, bufferLen, "-Dcom.chives.configuri="); 
    strcat_s(buffer, bufferLen, uri); 
    vm_args.options[index++].optionString = buffer; 
} 
for (int i=0; i<l_paramlines-1; i++) vm_args.options[index++].optionString=paramlines[i]; 
vm_args.ignoreUnrecognized=false; 
jint result=JNI_CreateJavaVM(&jvm, reinterpret_cast<void **>(&env), &vm_args); 
if (result!=JNI_OK) return 0; 
jclass cls=env->FindClass(paramlines[l_paramlines-1]); 
if (cls!=NULL) { 
    jmethodID mid=env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); 
    jobjectArray args=env->NewObjectArray(1, env->FindClass("java/lang/String"), NULL); 
    env->SetObjectArrayElement(args,0,env->NewStringUTF(game)); 
    env->CallStaticVoidMethod(cls, mid, args); 
} 

jvm->DestroyJavaVM(); 
return 0; 

мой код, где paramlines [l_paramlines-1] определяется как «Clazz», где нет пакета декларация в классе Clazz. Переменная cls содержит NULL-структуру, если я использую OpenJDK 7 jvm.dll, но возвращает правильную инициализированную структуру, если я использую Oracle JDK 8 jvm.dll.JNIEnv-> FindClass возвращает нуль OpenJDK 7, возвращает правильно Oracle JDK 8

Что еще интереснее, так это то, что OpenJDK 7 jvm.dll отлично работает, если мой JAR содержит ТОЛЬКО класс «Clazz», но сбой, если я включаю другие библиотеки (например, FasterXML Jackson/Log4j2). Я попытался упаковать свои банки с помощью Maven на IntelliJ и экспортировать как Runnable JAR на Eclipse. Ни одна из них не работает в OpenJDK 7 jvm.dll.

Мне нужно использовать OpenJDK 7 jvm.dll, так что мне интересно, если это ошибка с OpenJDK или с моей JAR-упаковкой.

Мой META-INF в различных случаях: Затмение Runnable JAR, работает на OpenJDK 7 jvm.dll, содержит только класс Clazz

Manifest-Version: 1.0 
Rsrc-Class-Path: ./ 
Class-Path: . 
Rsrc-Main-Class: Clazz 
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader 

Затмение Runnable JAR (извлекаемые классы), терпит неудачу OpenJDK 7, работает Oracle JDK 8, содержит Clazz + библиотекам

Manifest-Version: 1.0 
Class-Path: . 
Main-Class: Clazz 

IntelliJ Maven (извлекаемые классов), терпит неудачу OpenJDK 7, работает Oracle JDK 8, содержит Clazz + библиотеки

Manifest-Version: 1.0 
Archiver-Version: Plexus Archiver 
Created-By: Apache Maven 
Build-Jdk: 1.8.0_20 
Main-Class: Clazz 
Built-By: Chives 

ответ

0

При создании с OpenJDK 7 (1.7.0_91) в Linux и использовании JAR-файла в Windows JNIEnv-> FindClass работает должным образом (правильно находит основной класс). Кажется, это проблема Oracle JDK и OpenJDK.

Итак, создайте OpenJDK (и запустите OpenJDK).