1

问题1:在下面的函数中,我想在返回值之前调用 方法。在这种情况下,我如何做到这一点可能会导致应用程序崩溃。ReleaseStringUTFChars

String JNIXMLDOMDocument::GetXML() const
{
    String strXML;

    jmethodID method = m_JavaEnv->GetMethodID(m_XMLDomDocClass, "GetXML", "(Lorg/w3c/dom/Document;)Ljava/lang/String;");
    if(method == NULL) {
        return NULL;
    }

    jstring jstrXML = (jstring)m_JavaEnv->CallObjectMethod(m_XMLDomDocClassObject, method, m_XMLDomDocument);
    if (jstrXML == NULL) {
    return strXML;
    }

    strXML = m_JavaEnv->GetStringUTFChars(jstrXML, 0);

    /* Question 1:  **/
    m_JavaEnv->ReleaseStringUTFChars(jstrXML, strXML.c_str());

    return strXML;

} /* String GetXML() const **/

问题2:如果我的应用程序使用多线程,在构造函数中附加线程并在所有函数中使用它并在析构函数中分离是否正确?

JNIXMLDOMDocument::JNIXMLDOMDocument()
{
    /* Check If the current thread is attached to the virtual machine. **/
    int needToDetach;
    /* Question 2:  **/
    m_JavaEnv = AttachCurrentThread(&needToDetach);
    if (m_JavaEnv != NULL)
    {
        /* Try to find JAVA 'XMLDOMDocument' class. **/
    m_XMLDomDocClass = m_JavaEnv->FindClass("com/fido/android/framework/service/XMLDOMDocument");
    if (m_XMLDomDocClass != NULL) {
        jmethodID constructor = m_JavaEnv->GetMethodID(m_XMLDomDocClass, "<init>", "()V");
        if (constructor != NULL) {
            m_XMLDomDocClassObject = m_JavaEnv->NewObject(m_XMLDomDocClass, constructor);
        }
        else DBG_ERROR(DBG_CTX, ("Can't create object of 'XMLDOMDocument' class!\n"));
    }
    else DBG_ERROR(DBG_CTX, ("Can't find 'XMLDOMDocument' class!\n"));

    /* Try to find 'XMLDOMNode' class. **/
    jclass localXMLDomNodeClass = m_JavaEnv->FindClass("com/fido/android/framework/service/XMLDOMNode");
    if (localXMLDomNodeClass != NULL) {
        jmethodID constructor = m_JavaEnv->GetMethodID(localXMLDomNodeClass, "<init>", "()V");
        if (constructor != NULL) {
            m_XMLDomNodeClassObject = m_JavaEnv->NewObject(localXMLDomNodeClass, constructor);
        }
        else DBG_ERROR(DBG_CTX, ("Can't create object of 'XMLDOMNode' class!\n"));
    }
    else DBG_ERROR(DBG_CTX, ("Can't find 'XMLDOMNode' class!\n"));

    }

} /* JNIXMLDOMDocument() **/
4

2 回答 2

3

第一部分:我不知道你String是什么类型的。从它显然可以const char*分配并有c_str()方法的事实来看,我猜是一个std::string或类似的。进一步猜测,您String正在制作您提供给它的 cstring 的副本,因此它应该能够在释放原始 cstring 后继续存在。但是您正在释放您的内部的 cstring String,而不是您从中获得的 cstring GetStringUTFChars。所以你返回一个无效的String.

所以虽然答案是肯定的,但你确实必须调用 ReleaseStringUTFChars,正确的方法是

String strXML;
const char* tempStr = m_JavaEnv->GetStringUTFChars(jstrXML, 0);
strXML = tempStr;
m_JavaEnv->ReleaseStringUTFChars(jstrXML,tempStr);
return strXML;

我不能自信地回答第二部分,我不喜欢 NDK。提出单独的问题。

于 2012-06-11T14:09:23.467 回答
0

要单独回答您的第二个问题,没有提供足够的信息,但一般来说,如果两者都由同一个线程调用,您可以通过构造函数/析构函数对进行附加和分离。

于 2012-06-12T00:27:32.273 回答