안녕하세요
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);
}
소스는 위와 같이 하였습니다.