首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JNIEnv->FindClass返回null OpenJDK 7,正确返回Oracle JDK 8

JNIEnv->FindClass返回null OpenJDK 7,正确返回Oracle JDK 8
EN

Stack Overflow用户
提问于 2015-08-23 10:28:09
回答 1查看 203关注 0票数 1
代码语言:javascript
代码运行次数:0
运行
复制
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;

是我的代码,其中paramlinesl_paramlines 1被定义为" Clazz“,其中Clazz类中没有包声明。如果我使用Oracle7 jvm.dll,变量cls包含空结构,但如果我使用OracleJDK8 jvm.dll,变量cls将返回正确的初始化结构。

更有趣的是,如果我的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类

代码语言:javascript
代码运行次数:0
运行
复制
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,运行OracleJDK8,包含Clazz +库

代码语言:javascript
代码运行次数:0
运行
复制
Manifest-Version: 1.0
Class-Path: .
Main-Class: Clazz

Clazz Maven (提取的类),失败的OpenJDK 7,运行OracleJDK8,包含Clazz+库

代码语言:javascript
代码运行次数:0
运行
复制
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Build-Jdk: 1.8.0_20
Main-Class: Clazz
Built-By: Chives
EN

回答 1

Stack Overflow用户

发布于 2015-12-30 09:57:28

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32162608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档