마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ndk에서 pthread 사용 후 App 자동 종료

+1 추천

안녕하세요

App에 ndk를 접목하기 위하여 여러가지 테스트 중 해결이 안되는 부분이 있어 질문하여 봅니다.

NDK를 사용하여 JNI를 만들 때 pthread를 사용하였을 시 pthread에 등록한 함수의 내용이 끝나면

App도 같이 종료가 되고 있습니다.

이게 본래 그런것인지 아니면 제가 잘못한 부분이 있는 건지 궁금하네요.

#include <string.h>
#include <jni.h>
#include <pthread.h>

jmethodID t_mid;
jobject t_obj;
JavaVM* t_javaVM;

jint loopCheck = 10;

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void * reserved)
{
 t_javaVM = vm;
    return JNI_VERSION_1_6;
}

void JNI_OnUnload(JavaVM *vm, void *reserved)
{
 t_javaVM = NULL;
}

void* receive_thr() {
 JNIEnv* env = 0;
 (*t_javaVM)->AttachCurrentThread(t_javaVM, &env, 0);
 (*env)->CallVoidMethod(env, t_obj, t_mid, (*env)->NewStringUTF(env, "removeServiceCallback Callback first"));
 while(loopCheck)
 {
  (*env)->CallVoidMethod(env, t_obj, t_mid, (*env)->NewStringUTF(env, "removeServiceCallback Callback second"));
  loopCheck = loopCheck - 1;
  sleep();
 }
}

Java_com_example_processkill_MainActivity_receiveNativeSetting( JNIEnv* env,
                                                  jobject obj )
{
 jclass cls = (*env)->GetObjectClass(env, obj);
 t_mid = (*env)->GetMethodID(env, cls, "removeServiceCallback", "(Ljava/lang/String;)V");
    if (t_mid == NULL) {
        return;
    }
}

JNIEXPORT jint JNICALL
Java_com_example_processkill_MainActivity_receiveNativeStart(JNIEnv* env,
                                                  jobject obj )
{
 jint status;
 jint a = 1;
 t_obj = obj;
 pthread_t receive_thread;

 (*env)->CallVoidMethod(env, obj, t_mid, (*env)->NewStringUTF(env, "removeServiceCallback receiveNativeStart 1"));

    pthread_create(&receive_thread, NULL, receive_thr, (void *)&a);
    pthread_join(&receive_thread, (void **)&status);

 (*env)->CallVoidMethod(env, obj, t_mid, (*env)->NewStringUTF(env, "removeServiceCallback receiveNativeStart 2"));
}

Java_com_example_processkill_MainActivity_receiveNativeStop(JNIEnv* env,
                                                  jobject obj )
{
 (*env)->CallVoidMethod(env, t_obj, t_mid, (*env)->NewStringUTF(env, "removeServiceCallback receiveNativeStop"));
 pthread_exit(0);
}

소스는 위와 같이 하였습니다.

Elan's (760 포인트) 님이 2013년 3월 4일 질문

1개의 답변

0 추천
aucd29 (218,390 포인트) 님이 2013년 3월 18일 답변
...