如何使用 JNI C++ 调用 org.jdom.Element API

How to call org.jdom.Element APIs using JNI C++

JNI 新手。我正在尝试调用 Element::getChild 和 Element::getChild 文本 API (java org.jdom.Element) 以获取存储在“settings.xml”中的系统版本号这xml 文件归档在 JAR 文件中。假设根元素可用,这就是我正在做的:

jstring fileNameStr = env->NewStringUTF("settings.xml");
jobject rootElement = env->CallStaticObjectMethod(a_class, xmlRootElement_mid, fileNameStr);

jclass cls_element = env->FindClass("org/jdom/Element");

/*get method ID for getChild() & getChildText() */
jmethodID getChild_mid = env->GetMethodID(cls_element, "getChild", "(Ljava/lang/String;)Lorg/jdom/Element;");
jmethodID getChildText_mid = env->GetMethodID(cls_element, "getChildText", "(Ljava/lang/String;)Ljava/lang/String;");

jstring aboutStr = env->NewStringUTF("about");
jobject about = env->CallStaticObjectMethod(cls_element, getChild_mid, aboutStr); ---> Seg Faults!!!

基本上,我想做 Java 相当于这个:

In Java:
import org.jdom.Element;
...
Element element = SomeMethodToReadXmlFile("settings.xml");
version = element.getChild("about").getChildText("version");  <---- works

我应该怎么做?

使用 JNI,这是对我有用的 org.jdom.Element。我的 settings.xml 文件如下所示:

<?xml version="1.0">
<settings>
  <about>
     <version>1.0</version>
  </about>
</settings>

JNI C++:

jstring fileNameStr = env->NewStringUTF("settings.xml");

// assuming xmlRootElement_mid is known
jobject element_obj = env->CallStaticObjectMethod(a_class, xmlRootElement_mid, fileNameStr);

jclass cls_element = env->FindClass("org/jdom/Element");

/*get method ID for getChild() & getChildText() */
jmethodID getChild_mid = env->GetMethodID(cls_element, "getChild", "(Ljava/lang/String;)Lorg/jdom/Element;");
jmethodID getChildText_mid = env->GetMethodID(cls_element, "getChildText", "(Ljava/lang/String;)Ljava/lang/String;");

jstring jstr = env->NewStringUTF("about");
element_obj = env->CallObjectMethod(element_obj, getChild_mid, jstr)

jstr = env->NewStringUTF("version");
jstring version_str = (jstring)env->CallObjectMethod(element_obj, getChildText_mid, jstr);

//Convert to std::string
std::string version_std_str;
if (version_str)
{
   const char *c = env->GetStringUTFChars(version_str, 0);
   version_std_str = std::string(c);
   env->ReleaseStringUTFChars(version_str, c);
}
std::cout << version_std_str << std::endl

输出: 1.0