[ Android 에러 처리] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0x8c 에러 대응
현재 개발 된 프로젝트에서 이슈 발생된 내용을 수정한 내용을 적었습니다.
* 문제 발생 코드
METHOD( char *src_address, char *dst_address)
{
JNIEnv *env;
jmethodID method_id;
jstring jsrc_addr = NULL;
jstring jdst_addr = NULL;
int sr_len = strlen(src_address);
char *src = malloc(sr_len+1);
memset(src, 0, sr_len+1);
memcpy(src, src_address, sr_len);
int dst_len = strlen(dst_address);
char *dst_ip_d = malloc(dst_len+1);
memset(dst_ip_d, 0, dst_len+1);
memcpy(dst_ip_d, dst_address, dst_len);
method_id = (*env)->GetMethodID(env, android_charonvpnservice_class,
"address", "(Ljava/lang/String;Ljava/lang/String)V");
jsddr = (*env)->NewStringUTF(env, src);
jdadr = (*env)->NewStringUTF(env, dst_ip_d);
if(!jsrc_addr)
{
goto failed;
}
if (!jdst_addr)
{
goto failed;
}
(*env)->CallIntMethod(env, this->address, method_id, jsrc_addr, jdst_addr);
free(src);
free(dst_ip_d);
(*env)->DeleteLocalRef(env, jsrc_addr);
(*env)->DeleteLocalRef(env, jdst_addr);
}
* 발생 된 부분
- NewStringUTF 사용되는 부분에서 JNI Crash 발생
* 오류 메시지
JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0x8c runtime.cc:685] string: ' �^w' runtime.cc:685] input: '0x20 0x15 <0x8c> 0x5e 0x77' runtime.cc:685] in call to NewStringUTF |
- 입력된 값이 UTF-8 형식에 안 맞아 발생
- 값을 담고 있던 주소값에 다른 값이 쓰여지면서 Address 주소 데이터가 깨짐.... ㅂㄷㄷ
* 수정 코드
jbyteArray bytesddr = (*env)->NewByteArray(env, sr_len);
(*env)->SetByteArrayRegion(env, bytesddr, 0, sr_len, (const jbyte*)src);
jbyteArray bytedddr = (*env)->NewByteArray(env, dst_len);
(*env)->SetByteArrayRegion(env, bytedddr, 0, dst_len, (const jbyte*)dst_ip_d);
method_id = (*env)->GetMethodID(env, android_charonvpnservice_class,
"address", "([B[B)V");
(*env)->CallIntMethod(env, this->address, method_id, bytesddr, bytedddr);
free(src);
free(dst_ip_d);
(*env)->DeleteLocalRef(env, bytesddr);
(*env)->DeleteLocalRef(env, bytedddr);
- char* -> jstring으로 변환하여 Java에 String으로 넘겨주는게 아니라,
char* -> jbyteArray로 변환하여 Java에 byte[]으로 넘겨주도록 수정하였다.
- 즉, 문제가 되었던, NewStringUTF를 사용하지 않고 jbyteArray로 변환하여 전달
- 참고 : " Google Android NDK에 이미 보고된 버그가 있으므로 Android 4.0 이상에서 NewStringUTF()를 사용하지 마십시오 " 라고 버그 리포트가 있었음.....
* 참고 URL
NewString() & NewStringUTF() showing error not valid Modified UTF-8:
I am trying to pass char* from C++ to java using JNI in android. I have tried number of ways to pass that data 1) Using NewStringUTF: const char* data = getData(); // this method returns a char a...
stackoverflow.com
Android ICS 4.0 NDK NewStringUTF is crashing down the App
I have a method in JNI C/C++ which takes jstring and returns back jstring some thing like as below, NATIVE_CALL(jstring, method)(JNIEnv * env, jobject obj, jstring filename) { // Get jstring...
stackoverflow.com