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 !");
}
नोट है कि आप केवल चाहिए यदि आपने धागा संलग्न किया है तो 'DetachCurrentThread()' को कॉल करें। मौजूदा थ्रेड को अलग करने का व्यवहार यदि यह एक JVM- स्वामित्व वाला थ्रेड अनिर्धारित है। – technomage