Android

[ Android 에러 처리] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0x8c 에러 대응

중곰 2021. 7. 8. 16:18

현재 개발 된 프로젝트에서 이슈 발생된 내용을 수정한 내용을 적었습니다.

 

* 문제 발생 코드

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

https://stackoverflow.com/questions/14956439/newstring-newstringutf-showing-error-not-valid-modified-utf-8

 

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

https://stackoverflow.com/questions/12127817/android-ics-4-0-ndk-newstringutf-is-crashing-down-the-app

 

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

 

반응형