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.
Еще более интересно то, что OpenJDK 7 jvm.dll работает нормально, если мой JAR-файл содержит ТОЛЬКО класс «Clazz», но не работает, если я включаю другие библиотеки (такие как FasterXML Jackson / Log4j2). Я попытался упаковать мои банки, используя Maven на IntelliJ и экспортировать как Runnable JAR на Eclipse. Ни одна из них не работает на OpenJDK 7 jvm.dll.
Я должен использовать OpenJDK 7 jvm.dll, поэтому мне интересно, если это ошибка с OpenJDK или с моей упаковкой JAR.
Мой МЕТА-ИНФ в разных случаях:
Eclipse 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
Eclipse 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
При сборке с OpenJDK 7 (1.7.0_91) в Linux и использовании JAR-файла в Windows JNIEnv-> FindClass работает должным образом (правильно находит основной класс). Похоже, это проблема Oracle JDK против OpenJDK.
Так что сборка с OpenJDK (и запускать с OpenJDK).