android jni detachcurrentthread,Android JNI - Call AttachCurrentThread without DetachCurrentThread

Not calling DetachCurrentThread() will definitely cause a memory leak; other consequences are JVM-specific, and probably irrelevant for Android apps, where the JVM shuts down when the process exits. There are quite a few C++ wrappers that help to manage thread Attach/Detach, see for example: http://w01fe.com/blog/2009/05/c-callbacks-into-java-via-jni-made-easyier

Update: 1000 thanks to DetachCurrentThread(), brings the whole VM and the process crashing down.

Here is the logcat from the official emulator, my code based on the HelloJni sample from NDK:

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)

Here is the relevant function added to 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 !");

}

A nice implementation of this strategy can be found in WebRTC git repo.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值