gpt4 book ai didi

java.lang.NoClassDefFoundError :

转载 作者:行者123 更新时间:2023-12-01 12:46:43 24 4
gpt4 key购买 nike

你好,我正在编写一个 C++ 代码来从 .jar 类调用 java 函数。

这里是:

#include <jni.h>
int main()
{
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass JCTerminalClass;
jmethodID mid;
jobject obj;
char op0[] = "-Djava.class.path=C:\\Users\\DMNX1594\\Downloads\\jcop\\jcop/offcard.jar";
options[0].optionString =op0;
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;

status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

if (status != JNI_ERR)
{
JCTerminalClass = env->FindClass("JCTerminal");
jthrowable exc;
exc = env->ExceptionOccurred();
if (exc)
{
jclass newExcCls;
env->ExceptionDescribe();
env->ExceptionClear();
}

if(JCTerminalClass !=0)
{
mid = env->GetMethodID(JCTerminalClass, "com.ibm.jc.JCTerminal()", "()V");
// Call here instance function later ...
}
.
.
.
jvm->DestroyJavaVM();
return 0;
} else
return -1;
}

编译进行得很顺利,但是在执行过程中,我得到以下信息:

java.lang.NoClassDefFoundError: JCTerminal Caused by: java.lang.ClassNotFoundException: JCTerminal at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

我已经尝试从我创建的 .jar 中调用简单的静态 java 函数,并且它有效!该代码与此非常相似。

我尝试将 CLASSPATH 环境变量设置为 C:\path\to\jarFile\offcard.jar 因为我读到,当在编译期间找到该类但在执行期间未找到该类时,会发生 NoClassDefFoundError ...

可能是线程问题吗?

哦,这是我的编译命令:g++ -D __int64="long long"-I"C:\Program Files\Java\jdk1.8.0_05\include"-I"C:\Program Files\Java\jdk1.8.0_05\include\win32"-L"C:\Program Files\Java\jdk1.8.0_05\jre\bin\server"-L"C:\Program Files\Java\jdk1.8.0_05\lib"-o jni jni.cpp -ljvm

谢谢 stackoverflowers :)

最佳答案

您的代码似乎在 JCTerminalClass = env->FindClass("JCTerminal");

上失败

JNIEnv->FindClass 的文档是这样说的:

jclass FindClass(JNIEnv *env, const char *name);

[...]

The name argument is a fully-qualified class name or an array type signature . For example, the fully-qualified class name for the java.lang.String class is: "java/lang/String"

但是,您只是传递字符串 "JCTerminal" ,而没有任何包名称。稍后在示例中,您将在类名之前显示包名称:"com.ibm.jc.JCTerminal()"然而,在 JNI 代码中,包名称分隔符不是点 (.),而是斜杠 (/),如上面的文档所示。因此,您需要传递给 FindClass 方法的是 "com/ibm/jc/JCTerminal":

JCTerminalClass = env->FindClass("com/ibm/jc/JCTerminal");

关于java.lang.NoClassDefFoundError :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24633320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com