java - JNI CallStaticObjectMethod 在 C++ 中返回 NULL

标签 java c++ java-native-interface

这是 C++ 中的代码,我在其中创建了一个 Java 虚拟机,我需要从一个 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:";
 }

现在 ret_obj 为 NULL。我正在调用的 Java 函数将一个字符串作为参数,并从不同于 MyClass 的另一个类返回一个对象。

Java 方法是这样的 public static SomeClass readFromXML(String filepath)

更新 1 在 CallStaticObjectMethod 中,我们有这个 jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, ...){ va_list 参数; 作业结果; va_start(参数,methodID); 结果 = 函数->CallStaticObjectMethodV(this,clazz,me​​thodID,args); va_end(参数); 返回结果; }

va_start(args,methodID); 之后,args 的值是这样的 0x002cf5fc "0¦ύ" 所以也许参数有问题?

最佳答案

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

关于java - JNI CallStaticObjectMethod 在 C++ 中返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23757428/

相关文章:

虚拟表上的 C++ 虚拟析构函数和类的类型信息

C++ lambda 返回类型不是预期的

c++ - Qwt 和 QwtSeriesData

java - 使用 JNI 从 cpp 调用 java 方法时出现异常

java - 通过 Ant 编译 GWT

java.lang.ClassNotFoundException : org. glassfish.jersey.client.JerseyClientBuilder 错误?

java - 热敏打印机仅在设置断点时打印

java-native-interface - 从 JNI 加载 OSGi 类

java - 闪屏安卓

java - 找不到类型 : java. time.ZonedDateTime 的即时转换器