안드로이드 개발 질문/답변
(글 수 45,052)
안녕하십니까? 안드로이드상에서 jni을 이용하여 .so로 모듈을 작성하여 해당 함수처리 후 그 리턴결과(한글포함)을 리턴하고자하는데요.
환경) 안드로이드 에뮬레이터 (한글적용)
jni 연동 .so(.c 모듈과의 연동)
알고자하는것) 안드로이드 java쪽과 jni통해 .so의 리턴받은 msg(한글포함) 된것을 한글을 정상적으로 받고자합니다.
혹 안드로이드쪽 java <=> jni <=> .so 로 한글을 정상적으로 받는 방법을 아시는분이 계신지요..
.so에서 리턴된 결과를 java에서 한글이 깨져서 나와서 문의드립니다.
음 리턴된 msg가 한글이 깨져서 나옵니다. 이리저리해봐도 한글이 깨져서 나오네요. c (.so)파일쪽에서 확인해본바로는
정상적으로 한글이 나오구요.(로그찍어본 파일에 확인해본바로는..)
기존 cgwin환경에서는 한글테스트해보면.. 정상적으로 나옵니다.
도통 안드로이드쪽에서 테스트해보면 한글이 깨져서 나오네요.
(안드로이드는 한글화해서 한글 나오는것까진 확인했습니다. setText 로 한글을 임의로 찍어봄)
setText 로 jni통해서 넘어온 msg를 화면상에 출력해봐도 한글이 깨지구요. Log.d는 원체 한글이 깨진다고 하고..
c쪽에서 아래와 같이 선언한후..
======================== 1번째 테스트 - 배열로 작성후 배열로 java쪽으로 넘겨주고 ======================
char str[3][100] = {"노무현", "대통령", "짱!!!"};
for(i = 0; i < i1; i++)
{
(*env)->GetObjectArrayElement(env, ar, i);
iArray = javaNewString(env, cstr2jbyteArray(env, str[i]));
(*env)->SetObjectArrayElement(env, ar, i, iArray);
}
이렇게해서 리턴해주고.. ar을 java쪽에서 찍어봐도..
String msg_ar[] = new String[3];
Log.d("jni_log", "ar[" + i + "] = " + msg_ar[i]);
msg_ar[0] 이것도 한글은 깨져서 나오네요.
setText 로 확인해보면 한글이 깨져나옵니다.
======================== 1번째 테스트 - 배열로 작성후 배열로 java쪽으로 넘겨주고 ======================
======================== 2번째 테스트 -javaNewString cstr2jbyteArray로 작성후 java쪽으로 넘겨주고 ======================
혹시나 아래와 같이 하면 될까하고 또 변경해봐도..
cls = (*env)->GetObjectClass(env, obj);
jFieldId = (*env)->GetFieldID(env, cls, "msg", "Ljava/lang/String;");
msg = javaNewString(env, cstr2jbyteArray(env, msg_char));
(*env)->SetObjectField(env, obj, jFieldId, msg);
java에서..
result_msg = myJNI.msg; 을 해봐도 여전히 한글이 깨져서 나오구요.. 끙..
convert = new String(result_msg.getBytes("UTF-8"), "KSC5601");
결과]
1) output_msg는 .so에서 받은 내용을 그대로 찍은 내용이며
2) test_msg는 java쪽에서 test_msg = "1234567890한글테스트";
로 안드로이드쪽이 한글이 지원되는지 확인하기 위해 찍어본 내용..
3) conver_msg는 UTF-8을 KSC5601로 변환후 찍어본 내용입니다.
숫자같은 경우는 정상이고 한글만 깨져서 나옵니다. 움.. jstring이 utf-8이라 그걸 unicode로 변경해줘도 의도대로 되지않네요.
======================== 2번째 테스트 -javaNewString cstr2jbyteArray로 작성후 java쪽으로 넘겨주고 ======================
환경) 안드로이드 에뮬레이터 (한글적용)
jni 연동 .so(.c 모듈과의 연동)
알고자하는것) 안드로이드 java쪽과 jni통해 .so의 리턴받은 msg(한글포함) 된것을 한글을 정상적으로 받고자합니다.
혹 안드로이드쪽 java <=> jni <=> .so 로 한글을 정상적으로 받는 방법을 아시는분이 계신지요..
.so에서 리턴된 결과를 java에서 한글이 깨져서 나와서 문의드립니다.
음 리턴된 msg가 한글이 깨져서 나옵니다. 이리저리해봐도 한글이 깨져서 나오네요. c (.so)파일쪽에서 확인해본바로는
정상적으로 한글이 나오구요.(로그찍어본 파일에 확인해본바로는..)
기존 cgwin환경에서는 한글테스트해보면.. 정상적으로 나옵니다.
도통 안드로이드쪽에서 테스트해보면 한글이 깨져서 나오네요.
(안드로이드는 한글화해서 한글 나오는것까진 확인했습니다. setText 로 한글을 임의로 찍어봄)
setText 로 jni통해서 넘어온 msg를 화면상에 출력해봐도 한글이 깨지구요. Log.d는 원체 한글이 깨진다고 하고..
c쪽에서 아래와 같이 선언한후..
======================== 1번째 테스트 - 배열로 작성후 배열로 java쪽으로 넘겨주고 ======================
char str[3][100] = {"노무현", "대통령", "짱!!!"};
for(i = 0; i < i1; i++)
{
(*env)->GetObjectArrayElement(env, ar, i);
iArray = javaNewString(env, cstr2jbyteArray(env, str[i]));
(*env)->SetObjectArrayElement(env, ar, i, iArray);
}
이렇게해서 리턴해주고.. ar을 java쪽에서 찍어봐도..
String msg_ar[] = new String[3];
Log.d("jni_log", "ar[" + i + "] = " + msg_ar[i]);
msg_ar[0] 이것도 한글은 깨져서 나오네요.
setText 로 확인해보면 한글이 깨져나옵니다.
======================== 1번째 테스트 - 배열로 작성후 배열로 java쪽으로 넘겨주고 ======================
======================== 2번째 테스트 -javaNewString cstr2jbyteArray로 작성후 java쪽으로 넘겨주고 ======================
혹시나 아래와 같이 하면 될까하고 또 변경해봐도..
cls = (*env)->GetObjectClass(env, obj);
jFieldId = (*env)->GetFieldID(env, cls, "msg", "Ljava/lang/String;");
msg = javaNewString(env, cstr2jbyteArray(env, msg_char));
(*env)->SetObjectField(env, obj, jFieldId, msg);
java에서..
result_msg = myJNI.msg; 을 해봐도 여전히 한글이 깨져서 나오구요.. 끙..
convert = new String(result_msg.getBytes("UTF-8"), "KSC5601");
결과]
1) output_msg는 .so에서 받은 내용을 그대로 찍은 내용이며
2) test_msg는 java쪽에서 test_msg = "1234567890한글테스트";
로 안드로이드쪽이 한글이 지원되는지 확인하기 위해 찍어본 내용..
3) conver_msg는 UTF-8을 KSC5601로 변환후 찍어본 내용입니다.
숫자같은 경우는 정상이고 한글만 깨져서 나옵니다. 움.. jstring이 utf-8이라 그걸 unicode로 변경해줘도 의도대로 되지않네요.
======================== 2번째 테스트 -javaNewString cstr2jbyteArray로 작성후 java쪽으로 넘겨주고 ======================
2010.05.03 16:45:56
음.. 그게.. output_msg = (*env)->NewStringUTF(env, "Hello from JNI 한글!"); 이렇게 해주면..
거기서 종료됩니다. 한글을 직접 넣어줘서 그런지...
char output_msg[1024];
sprintf(output_msg, "한글테스트1234");
음 그리고 output_msg = (*env)->NewStringUTF(env,output_msg);
이렇게 해주면 숫자는 잘 나오고 한글은 깨지구요..
거기서 종료됩니다. 한글을 직접 넣어줘서 그런지...
char output_msg[1024];
sprintf(output_msg, "한글테스트1234");
음 그리고 output_msg = (*env)->NewStringUTF(env,output_msg);
이렇게 해주면 숫자는 잘 나오고 한글은 깨지구요..
2010.05.03 16:51:51
05-03 07:50:41.331: DEBUG/jni_log(6693): [Java] xxxx00 output_msg => 1234567890�ѱ��׽�Ʈ1234567
05-03 07:50:41.370: DEBUG/jni_log(6693): [Java] xxxx11 uni => 1234567890íê¸í ì¤í¸123
1번째꺼가 .so에서 받은건데 깨지는 한글이네요.. 움..
2번째꺼가 java에서 String uni = "1234567890한글테스트123"; 로 넣어준건데요. Log.d에선 한글이 깨지는데.. 화면상엔 정상적으로 한글이 나옵니다.
05-03 07:50:41.370: DEBUG/jni_log(6693): [Java] xxxx11 uni => 1234567890íê¸í ì¤í¸123
1번째꺼가 .so에서 받은건데 깨지는 한글이네요.. 움..
2번째꺼가 java에서 String uni = "1234567890한글테스트123"; 로 넣어준건데요. Log.d에선 한글이 깨지는데.. 화면상엔 정상적으로 한글이 나옵니다.
2010.05.03 17:17:03
output_msg = javaNewString(env, cstr2jbyteArray(env, output_msg_char));
//output_msg = (*env)->NewStringUTF(env, output_msg_char);
이렇게 두개를 모두 해봤는데 둘다 한글깨지는것도 깨지는 글자도 동일하게 나오네요. 혹시나 reflesh 안될까봐..
sprintf(output_msg_char, "1234567890한글테스트1234567"); => sprintf(output_msg_char, "1234567890한글테스트12345678");
이렇게 8을 넣어서 찍어봤는데 위의 사진 글자 깨진것처럼 똑같이 나옵니다. 숫자8은 더 찍히고..
javaNewString, NewStringUTF 동일한 한글로 깨져서 찍히는것보면 희한한데요.