问题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() **/
答案 0 :(得分:3)
第一部分:我不知道你的String
是什么类型。从显然可以进行const char*
分配并使用c_str()
方法的事实来看,我猜是std::string
或类似的。进一步猜测,你的String
正在复制你给它的cstring,所以它应该在释放原始cstring后继续存在。但是你发布了String
中的cstring,而不是GetStringUTFChars
中的cstring。因此,您将返回无效的String
。
所以虽然答案是肯定的,但你确实必须调用ReleaseStringUTFChars,正确的方法是
String strXML;
const char* tempStr = m_JavaEnv->GetStringUTFChars(jstrXML, 0);
strXML = tempStr;
m_JavaEnv->ReleaseStringUTFChars(jstrXML,tempStr);
return strXML;
我不能满怀信心地回答第二部分,我不是NDK。提出单独的问题。
答案 1 :(得分:0)
单独回答第二个问题,提供的信息不足,但一般情况下,如果两个问题都由同一个线程调用,则可以通过构造函数/析构函数对进行附加和分离。