例外检查()){ cout-GetStaticMethodID(xml_-read,“readFromXML”,“(Ljava/lang/String;)L;”; 如果(环境->例外检查()){ cout NewStringUTF(文件路径); jobject ret_obj=env->CallStaticObjectMethod(xml\u read,read\u xml,file); 如果(环境->例外检查()){ cout CallStaticObjectMethodV(this、clazz、methodID、args); va_端(args); 返回结果; },java,c++,java-native-interface,Java,C++,Java Native Interface" /> 例外检查()){ cout-GetStaticMethodID(xml_-read,“readFromXML”,“(Ljava/lang/String;)L;”; 如果(环境->例外检查()){ cout NewStringUTF(文件路径); jobject ret_obj=env->CallStaticObjectMethod(xml\u read,read\u xml,file); 如果(环境->例外检查()){ cout CallStaticObjectMethodV(this、clazz、methodID、args); va_端(args); 返回结果; },java,c++,java-native-interface,Java,C++,Java Native Interface" />

JNI CallStaticObjectMethod在c++; 这里是C++代码,在这里我创建了一个java VM,我需要从jar调用函数。 JavaVM *jvm; /* denotes a Java VM */ JNIEnv *env; /* pointer to native method interface */ JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */ jmethodID constr = NULL; jmethodID Read_XML = NULL; JavaVMOption* options = new JavaVMOption[1]; options[0].optionString = "-Djava.class.path=<path_to_my_jar>"; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; /* load and initialize a Java VM, return a JNI interface * pointer in env */ long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status == JNI_ERR){ cout << "Fail: Unable to load JVM \t Exit" << endl; } jclass xml_read = env->FindClass("<MyClass>"); if (env->ExceptionCheck()){ cout << "Fail:"; } constr = env->GetMethodID(xml_read, "<init>", "()V"); if (env->ExceptionCheck()){ cout << "Fail:"; } Read_XML = env->GetStaticMethodID(xml_read,"readFromXML", "(Ljava/lang/String;)L<MyClass>;"); if (env->ExceptionCheck()){ cout << "Fail:"; } const char* filepath = "<My_filepath>"; const jstring file = env->NewStringUTF(filepath); jobject ret_obj = env->CallStaticObjectMethod(xml_read,Read_XML,file); if (env->ExceptionCheck()){ cout << "Fail:"; } JavaVM*jvm;/*表示Java虚拟机*/ JNIEnv*env;/*指向本机方法接口的指针*/ JavaVMInitArgs vm_args;/*JDK/JRE 6虚拟机初始化参数*/ jmethodID constr=NULL; jmethodID Read_XML=NULL; JavaVMOption*options=新的JavaVMOption[1]; 选项[0]。选项字符串=“-Djava.class.path=”; vm_args.version=JNI_version_1_6; vm_args.nOptions=1; vm_args.options=选项; vm_args.ignoreunrecogned=JNI_TRUE; /*加载并初始化JavaVM,返回JNI接口 *环境中的指针*/ long status=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); 如果(状态==JNI_ERR){ cout ExceptionCheck()){ coutgetmethodid(xml_-read,“,”()V”); 如果(环境->例外检查()){ cout-GetStaticMethodID(xml_-read,“readFromXML”,“(Ljava/lang/String;)L;”; 如果(环境->例外检查()){ cout NewStringUTF(文件路径); jobject ret_obj=env->CallStaticObjectMethod(xml\u read,read\u xml,file); 如果(环境->例外检查()){ cout CallStaticObjectMethodV(this、clazz、methodID、args); va_端(args); 返回结果; }

JNI CallStaticObjectMethod在c++; 这里是C++代码,在这里我创建了一个java VM,我需要从jar调用函数。 JavaVM *jvm; /* denotes a Java VM */ JNIEnv *env; /* pointer to native method interface */ JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */ jmethodID constr = NULL; jmethodID Read_XML = NULL; JavaVMOption* options = new JavaVMOption[1]; options[0].optionString = "-Djava.class.path=<path_to_my_jar>"; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; /* load and initialize a Java VM, return a JNI interface * pointer in env */ long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status == JNI_ERR){ cout << "Fail: Unable to load JVM \t Exit" << endl; } jclass xml_read = env->FindClass("<MyClass>"); if (env->ExceptionCheck()){ cout << "Fail:"; } constr = env->GetMethodID(xml_read, "<init>", "()V"); if (env->ExceptionCheck()){ cout << "Fail:"; } Read_XML = env->GetStaticMethodID(xml_read,"readFromXML", "(Ljava/lang/String;)L<MyClass>;"); if (env->ExceptionCheck()){ cout << "Fail:"; } const char* filepath = "<My_filepath>"; const jstring file = env->NewStringUTF(filepath); jobject ret_obj = env->CallStaticObjectMethod(xml_read,Read_XML,file); if (env->ExceptionCheck()){ cout << "Fail:"; } JavaVM*jvm;/*表示Java虚拟机*/ JNIEnv*env;/*指向本机方法接口的指针*/ JavaVMInitArgs vm_args;/*JDK/JRE 6虚拟机初始化参数*/ jmethodID constr=NULL; jmethodID Read_XML=NULL; JavaVMOption*options=新的JavaVMOption[1]; 选项[0]。选项字符串=“-Djava.class.path=”; vm_args.version=JNI_version_1_6; vm_args.nOptions=1; vm_args.options=选项; vm_args.ignoreunrecogned=JNI_TRUE; /*加载并初始化JavaVM,返回JNI接口 *环境中的指针*/ long status=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); 如果(状态==JNI_ERR){ cout ExceptionCheck()){ coutgetmethodid(xml_-read,“,”()V”); 如果(环境->例外检查()){ cout-GetStaticMethodID(xml_-read,“readFromXML”,“(Ljava/lang/String;)L;”; 如果(环境->例外检查()){ cout NewStringUTF(文件路径); jobject ret_obj=env->CallStaticObjectMethod(xml\u read,read\u xml,file); 如果(环境->例外检查()){ cout CallStaticObjectMethodV(this、clazz、methodID、args); va_端(args); 返回结果; },java,c++,java-native-interface,Java,C++,Java Native Interface,va_start(args,methodID);args的值如下0x002cf5fc“0ύ” 那么,可能参数有问题吗?好的,这个问题解决了。这是我的错,在文件路径中,我应该定义XML文件,而不仅仅是包含此文件的文件。谢谢你你检查了MyClass.readFromXML(文件)是否正确了吗实际上是否返回null?实际上我不确定是否可以这样做,因为我只有jar,所以如何检查这是否是Java问题,或者调用CallStaticObjectMethodva_start(args,clazz)的方式是否有问

va_start(args,methodID);
args的值如下
0x002cf5fc“0ύ”

那么,可能参数有问题吗?

好的,这个问题解决了。这是我的错,在文件路径中,我应该定义XML文件,而不仅仅是包含此文件的文件。谢谢你

你检查了MyClass.readFromXML(文件)是否正确了吗实际上是否返回null?实际上我不确定是否可以这样做,因为我只有jar,所以如何检查这是否是Java问题,或者调用CallStaticObjectMethod
va_start(args,clazz)的方式是否有问题
此行错误。请删除此行,然后重试。您不应直接解析/取消引用va_列表,因为实现可能因平台而异。通常va_列表包含指向堆栈的指针。但是,如果删除此行,args将不会得到任何值。这是我从JDK文件下载的jni.h文件。这是你提到的ne是我在写这篇文章时错加的,所以不幸的是这不是错误