【发布时间】:2014-07-08 13:38:17
【问题描述】:
您好,我正在编写一个 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 引起: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 (本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:360) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 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 :)
【问题讨论】:
-
你确定类路径不是-cp吗?
-
你的意思是在编译命令中? -cp 用于java编译...
-
这也是
java命令的参数。 -
很抱歉,我没有正确理解您的第一条评论。你到底在暗示什么?谢谢!
-
没关系,我检查了文档 - 您使用了正确的选项
标签: java java-native-interface