2014-10-23 7 views
12

मैं जेएनआई सामान के बारे में पढ़ रहा हूं और यह पता लगाना प्रतीत नहीं होता कि थ्रेड शुरू होने पर क्या होता है -> कॉल AttachCurrentThread() -> कुछ जेएनआई कॉल -> थ्रेड निकास करें।एंड्रॉइड जेएनआई - DetachCurrentThread बिना DetachCurrentThread

आदर्श रूप से, हमें थ्रेड निकास से पहले DetachCurrentThread() को कॉल करना चाहिए, हालांकि, यदि ऐप ऐसा नहीं करता है तो क्या प्रभाव हैं? क्या यह स्मृति रिसाव या किसी अन्य समस्या का कारण बनता है?

+0

नोट है कि आप केवल चाहिए यदि आपने धागा संलग्न किया है तो 'DetachCurrentThread()' को कॉल करें। मौजूदा थ्रेड को अलग करने का व्यवहार यदि यह एक JVM- स्वामित्व वाला थ्रेड अनिर्धारित है। – technomage

उत्तर

20

DetachCurrentThread() पर कॉल नहीं करना निश्चित रूप से स्मृति रिसाव का कारण बन जाएगा; अन्य परिणाम JVM- विशिष्ट हैं, और शायद एंड्रॉइड ऐप्स के लिए अप्रासंगिक हैं, जहां प्रक्रिया से बाहर निकलने पर JVM बंद हो जाती है। http://w01fe.com/blog/2009/05/c-callbacks-into-java-via-jni-made-easyier

अपडेट:: वहाँ काफी कुछ सी ++ रैपर कि धागा संलग्न/अलग करें, उदाहरण के लिए देखें प्रबंधन में मदद कर रहे हैंfadden आंख खोलने link के लिए 1000 धन्यवाद; Dalvik पर, एक धागा जो DetachCurrentThread() पर कॉल किए बिना निकलता है, पूरे वीएम और प्रक्रिया को क्रैश कर देता है।

यहाँ आधिकारिक एमुलेटर से logcat, मेरे कोड NDK से HelloJni नमूने के आधार पर है:

10-26 04:16:25.853: D/dalvikvm(1554): Trying to load lib /data/app-lib/com.example.hellojni-2/libhello-jni.so 0xb3d264f0 
10-26 04:16:25.893: D/dalvikvm(1554): Added shared lib /data/app-lib/com.example.hellojni-2/libhello-jni.so 0xb3d264f0 
10-26 04:16:25.893: D/dalvikvm(1554): No JNI_OnLoad found in /data/app-lib/com.example.hellojni-2/libhello-jni.so 0xb3d264f0, skipping init 
10-26 04:16:26.463: D/gralloc_goldfish(1554): Emulator without GPU emulation detected. 
10-26 04:16:31.033: D/threadFunction(1554): Attaching 
10-26 04:16:31.173: D/threadFunction(1554): Not Detaching 
10-26 04:16:31.183: D/dalvikvm(1554): threadid=11: thread exiting, not yet detached (count=0) 
10-26 04:16:31.193: D/dalvikvm(1554): threadid=11: thread exiting, not yet detached (count=1) 
10-26 04:16:31.193: E/dalvikvm(1554): threadid=11: native thread exited without detaching 
10-26 04:16:31.193: E/dalvikvm(1554): VM aborting 
10-26 04:16:31.213: A/libc(1554): Fatal signal 6 (SIGABRT) at 0x00000612 (code=-6), thread 1567 (xample.hellojni) 

यहाँ प्रासंगिक समारोह hello-jni.c को जोड़ा गया है:

static JavaVM* jvm = 0; 
static jobject activity = 0; // GlobalRef 

void* threadFunction(void* irrelevant) 
{ 
    JNIEnv* env; 
    usleep(5000000); 

    __android_log_print(ANDROID_LOG_DEBUG, "threadFunction", "Attaching"); 

    (*jvm)->AttachCurrentThread(jvm, &env, NULL); 

    jclass clazz = (*env)->GetObjectClass(env, activity); 
    jmethodID methodID = (*env)->GetMethodID(env, clazz, "finish", "()V"); 
    (*env)->CallVoidMethod(env, activity, methodID); 

    __android_log_print(ANDROID_LOG_DEBUG, "threadFunction", "Not Detaching"); 
// (*jvm)->DetachCurrentThread(jvm); 
} 

jstring 
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, 
                jobject thiz) 
{ 
    (*env)->GetJavaVM(env, &jvm); 
    activity = (*env)->NewGlobalRef(env, thiz); 

    pthread_t hThread; 
    pthread_create(&hThread, NULL, &threadFunction, NULL); 
    return (*env)->NewStringUTF(env, "Hello from JNI !"); 
} 
+0

मैं लिंक तक नहीं पहुंच सकता। – pree

+0

इसके अलावा, अगर मैं बड़ी संख्या में धागे बना देता हूं और बिना किसी डिटेच के अटैचक्रेंटथ्रेड को कॉल करता हूं, तो मेमोरी रिसाव संभव है। हालांकि, क्या होता है यदि कुछ लंबे समय तक चलने वाले थ्रेड होते हैं और वे detachcurrentthread को कॉल किए बिना बाहर निकलते हैं। प्रभाव क्या होगा? एक बार यह निकलने के बाद स्वचालित रूप से खुद को अलग नहीं करता है? – pree

+0

नहीं, प्रक्रियाएं तब तक "स्वचालित रूप से स्वयं को अलग नहीं करतीं" (और एंड्रॉइड पर एक ही समय में जेवीएम) बंद हो जाती है। जैसा कि मैंने उल्लेख किया है, अन्य प्लेटफार्मों पर, जहां JVM एक प्रक्रिया या _vice versa_ से अधिक हो सकता है, प्रभाव अधिक दर्दनाक हो सकता है। इसके अलावा, रिसाव बहुत महत्वपूर्ण हो सकता है, यह इस बात पर निर्भर करता है कि विशेष धागा अपने जेएनआई को कैसे संभालता है। –

संबंधित मुद्दे