2012-06-11 2 views
1

Вопрос 1: В функции ниже я хочу вызоваReleaseStringUTFCharsметод до возвращения значения. Как я могу это сделать, так как в этом случае может произойти сбой приложений.управление памятью JNI

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() **/ 
+0

Что означает вторая часть для Android? –

+0

Но вы все же должны изолировать свои проблемы до самых мелких значимых ответных частей, а не объединять их вместе. –

ответ

3

Первая часть: я не знаю, какой тип String есть. Из-за того, что он, по-видимому, может принимать const char*, и имеет метод c_str(), я думаю, std::string или аналогичный. Угадайте еще, что ваш String делает копию строки, которую вы ему даете, поэтому он должен выжить, выпустив оригинальную строку cstring. Но вы выпускаете cstring внутри своего String, а не тот, который вы получили от GetStringUTFChars. Таким образом, вы возвращаете недопустимый String.

Таким образом, хотя ответ да, вы действительно должны вызвать ReleaseStringUTFChars, правильный путь

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

Я не могу ответить на вторую часть уверенно, я не в НДК. Задайте отдельный вопрос.

+0

Хорошо, я попробую и дам вам знать! –

+0

это работа !!! А как насчет вопроса 2? :) Можете ли вы мне помочь? –

+0

и если я вызываю 'm_XMLDomDocClass = m_JavaEnv-> FindClass (« com/fido/android/framework/service/XMLDOMDocument »);' где m_XMLDomDocClass - это объект jclass и член класса, я должен вызвать 'm_JavaEnv-> DeleteGlobalRef (m_XMLDomDocClass) ; или сделать что-то еще? –

0

Чтобы ответить на ваш второй вопрос в одиночку, информации недостаточно, но в целом вы можете присоединить и отсоединить через пару конструктора/деструктора, если оба они вызываются одним и тем же потоком.

+0

, какая информация вам нужна? Я могу предоставить вам, я могу дать вам классы .cpp и .h файлов, если хотите! –

+0

@ViToBrothers Недостающая информация заключается в том, вызывается ли конструктор и деструктор одним и тем же потоком. – EJP

+0

и если конструктор и деструктор вызываются из разделенных потоков? –

Смежные вопросы