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

JNI 쪽에서 자꾸 죽어버려요.

0 추천
안녕하세요 개발자님들.

안펍에서 공부 많이 하고 가는 사회 초년생입니다.

다름이 아니라 JNI쪽은 거의 생소해서 문제가 참 많이 생기는데 오늘도 어김없이 문제가 생기네요 ㅠㅠ...

어플에서 JNI를 호출하면 잘 돌아가는데 유독 한 부분에서 자꾸만 어플이 종료가 됩니다.

이게 오류 메시지라도 뿌리면서 죽으면 추적이나 하겠는데 오류조차 안뿌리고 죽어뿌네요.

 

그래서 삽질하고 해서 겨우겨우 찾았더니

 

JNIEXPORT.....()

{

unsigned char *result; //

result = (char *)malloc(19200); //  

   jint leng = (*g_env)->GetArrayLength(g_env, jdata);
    (*g_env)->GetByteArrayRegion(g_env, jdata, 0, leng, (jbyte *)result);
    result[leng] = 0;  

    free(result);

}

요부분이더라고요.

byte[] 를 네이티브 c 의 char * 형으로 바꾸는건데 이 부분을 주석제거하면 어플이 잘 돌아가고 이 부분이 껴있으면 계속해서 죽어버리구요.

 

이 함수는 꼭 필요한거라 쓰기는 해야 하는데 자꾸 문제가 생기니 난감합니다.

쓰레드로 돌리기 때문에 속도가 빠른가 해서 jni단에 슬립을 줘봣는데도 죽는건 매한가지입니다.

뭐가 문제일까요...

malloc 문제일까 이걸 전역변수로 만든다음 다른 함수에 넣었는데도 똑같네용...
정상??인 (340 포인트) 님이 2015년 11월 12일 질문

2개의 답변

+1 추천

leng 길이가 몇인가요? 

19200 보다 작은 값이면 문제 없지만 

19200이상이면  result[leng] = 0;  에서 할당되지 않는 공간에 0을 넣으려다 

죽을 듯 한데요.. 문자열이 아닌데 0(NULL) 을 넣을 필요가 있는지도 의문입니다만.

 굳이 0을 마지막에 넣어 주어야 한다면, 

result = (char *)malloc(leng + 1); 로 malloc 하셔야 할듯 합니다.

익명사용자 님이 2015년 11월 12일 답변
0 추천
익명사용자 님이 2015년 11월 12일 답변
...