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 类中没有包声明。如果我使用 OpenJDK 7 jvm.dll,变量 cls 包含 NULL 结构,但如果我使用 Oracle JDK 8 jvm.dll,则返回正确的初始化结构。

更有趣的是,如果我的 JAR 仅包含“Clazz”类,OpenJDK 7 jvm.dll 可以正常工作,但如果我包含其他库(例如 FasterXML Jackson/Log4j2)则失败。我尝试在 IntelliJ 上使用 Maven 打包我的 jar,并在 Eclipse 上导出为 Runnable JAR。两者都不适用于 OpenJDK 7 jvm.dll。

我必须使用 OpenJDK 7 jvm.dll,所以我想知道这是 OpenJDK 的错误,还是我的 JAR 打包的错误。

我在各种情况下的 META-INF: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
4

1 回答 1

0

在 Linux 上使用 OpenJDK 7 (1.7.0_91) 构建并在 Windows 上使用 JAR 文件时,JNIEnv->FindClass 按预期工作(正确找到主类)。这似乎是 Oracle JDK 与 OpenJDK 的问题。

所以使用 OpenJDK 构建(并使用 OpenJDK 运行)。

于 2015-12-30T01:57:27.713 回答