2015-08-23 92 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中沒有包聲明。如果我使用OpenJDK 7 jvm.dll,則變量cls包含NULL結構,但如果使用Oracle JDK 8 jvm.dll,則會返回正確的初始化結構。JNIEnv-> findClass的返回null OpenJDK 7的,則返回正確的Oracle 8 JDK

更有意思的是,如果我的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運行的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運行的JAR(提取類),失敗的OpenJDK 7,運行甲骨文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

在Linux上使用OpenJDK 7(1.7.0_91)構建並在Windows上使用JAR文件時,JNIEnv-> FindClass按預期工作(正確找到主類)。這似乎是一個Oracle JDK和OpenJDK問題。

因此使用OpenJDK構建(並使用OpenJDK運行)。