JNI:找不到类或FindClass返回NULL 我用C++尝试JNI。但是我得到了这个错误:找不到类。我搜索了其他解决方案,但没有为我工作。 Code.java: package com.xxx; public class Code { public void getMessage() { System.out.println("Hello World!"); } } #include <jni.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { JavaVM* jvm; JNIEnv* env; JavaVMInitArgs jvm_args; JavaVMOption options[1]; options[0].optionString = "-Djava.class.path=myclasses"; jvm_args.version = JNI_VERSION_1_2; jvm_args.options = options; jvm_args.nOptions = 1; jvm_args.ignoreUnrecognized = JNI_TRUE; jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &jvm_args); if (res < 0) { cout << "Cannot create JVM!\n"; exit(1); } jclass class_ = env->FindClass("com/xxx/Code"); if (class_ == 0) { cout << "Code class not found!\n"; exit(1); } jmethodID method_id = env->GetMethodID(class_, "getMessage", "()V"); if (method_id == 0) { cout << "getMessage() method not found!\n"; exit(1); } env->CallVoidMethod(class_, method_id); return 0; }
main.cpp:JNI:找不到类或FindClass返回NULL 我用C++尝试JNI。但是我得到了这个错误:找不到类。我搜索了其他解决方案,但没有为我工作。 Code.java: package com.xxx; public class Code { public void getMessage() { System.out.println("Hello World!"); } } #include <jni.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { JavaVM* jvm; JNIEnv* env; JavaVMInitArgs jvm_args; JavaVMOption options[1]; options[0].optionString = "-Djava.class.path=myclasses"; jvm_args.version = JNI_VERSION_1_2; jvm_args.options = options; jvm_args.nOptions = 1; jvm_args.ignoreUnrecognized = JNI_TRUE; jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &jvm_args); if (res < 0) { cout << "Cannot create JVM!\n"; exit(1); } jclass class_ = env->FindClass("com/xxx/Code"); if (class_ == 0) { cout << "Code class not found!\n"; exit(1); } jmethodID method_id = env->GetMethodID(class_, "getMessage", "()V"); if (method_id == 0) { cout << "getMessage() method not found!\n"; exit(1); } env->CallVoidMethod(class_, method_id); return 0; },java,c++,java-native-interface,Java,C++,Java Native Interface,main.cpp: package com.xxx; public class Code { public void getMessage() { System.out.println("Hello World!"); } } #include <jni.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { JavaVM* jvm; J
package com.xxx;
public class Code
{
public void getMessage()
{
System.out.println("Hello World!");
}
}
#include <jni.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
JavaVM* jvm;
JNIEnv* env;
JavaVMInitArgs jvm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=myclasses";
jvm_args.version = JNI_VERSION_1_2;
jvm_args.options = options;
jvm_args.nOptions = 1;
jvm_args.ignoreUnrecognized = JNI_TRUE;
jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &jvm_args);
if (res < 0)
{
cout << "Cannot create JVM!\n";
exit(1);
}
jclass class_ = env->FindClass("com/xxx/Code");
if (class_ == 0)
{
cout << "Code class not found!\n";
exit(1);
}
jmethodID method_id = env->GetMethodID(class_, "getMessage", "()V");
if (method_id == 0)
{
cout << "getMessage() method not found!\n";
exit(1);
}
env->CallVoidMethod(class_, method_id);
return 0;
}
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
JavaVM*jvm;
JNIEnv*env;
JavaVMInitArgs jvm_args;
JavaVMOption选项[1];
选项[0]。选项字符串=“-Djava.class.path=myclasses”;
jvm_args.version=JNI_version_1_2;
jvm_args.options=选项;
jvm_args.nOptions=1;
jvm_args.ignoreunrecogned=JNI_TRUE;
jint res=JNI_CreateJavaVM(&jvm,(void**)&env,&jvm_args);
如果(res<0)
{
cout FindClass(“com/xxx/Code”);
如果(类=0)
{
cout-GetMethodID(class_u2;,“getMessage”,即“()V”);
if(方法_id==0)
{
cout CallVoidMethod(类,方法id);
返回0;
}
我的文件目录:我试过
-Djava.class.path=myclasses/com/xxx
和env->FindClass(“code”);
。我也试过-Djava.class.path=myclasses
和env->FindClass(“com/xxx/code”)
。但两者都不起作用。找不到代码类的原因是什么!
消息?我最初在评论中提到了这一点,但海报表明这是解决方案
<>你的代码假定“MyCype”是C++程序的CWD下的一个文件夹。虽然目录结构看起来正确,但除非CWD是“MyC类”的父类,否则这将无法工作。看看你在哪里你是用javac编译Code.java吗?我用javac编译Code.java。但结果是一样的。你确定在执行main时MyClass在工作目录中吗?“Class not found!”是程序打印的错误消息。它包含的有用信息很少。你需要的是挂起的异常当你得到null返回。这将告诉你为什么。你的代码假定“MyCype”是C++程序的CWD下的一个文件夹。虽然目录结构看起来正确,但除非CWD是“MyC类”的父类,否则这将无法工作。请尝试打印GETCWD()的返回,并查看您在哪里。