안드로이드 개발 질문/답변
(글 수 45,052)
안녕하십니까? jni를 통해 java와 .c(.so)의 연동을 하고 있습니다.
테스트 해보니 java와 jni .c(.so) 끼리는 utf-8을 통한(jni) 한글데이타 send, recive는 잘되더군요..
java 는 unicode
jni jstring은 utf-8
.c(.so)는 ansi(소켓통신) 입니다.
java 에서 string을 하나 만든 후 그걸 jni 통해서 .c(.so)로 전달하면 한글이 깨지지않고 잘 전달됩니다.
또 .c(.so)에서 java에서 던진 string을 char에 복사한 후 다시 jni 통해서 java로 던지면 한글이 잘 출력됩니다.
한데 .c(.so)에서 소켓통신으로 받은 char(ansi) 코드를 java쪽으로 jni통해서 던지면..
한글이 죽어도 깨집니다. java쪽에서 KSC5601로 디코딩해도 깨지더군요..
jni통하면서 한글이 깨져버리는지.. 그래서 .c(.so)에서 hex로 convert 후 java쪽으로 던져줬습니다.
hex는 어차피 숫자이니 변할께 없죠.. java쪽에서 정확히 hex코드를 받았습니다.
그걸 다시 hex to string으로 변경 하니 똑같이 한글이 깨지더군요..
의문이 hex로 변경한 char(ansi)가.. (전 jni 통하면서 utf-8로 강제적으로 변경돼서 한글이 깨지는가했는데.. => 아직도 이렇다고 생각함)
근데 hex로 변경 한 내용이 정확히 java쪽으로 전달돼고 그걸 java에서 hex to string으로 변경하니 똑같이 깨지는겁니다...
hex가 다시 ansi코드로 원복되는가보네요. 그래서 hex to string한걸 디코딩 해줘봤습니다. 그래도 한글이 정상적으로 복원이
안되는데요.
.c(.so)에서 ansi로 된 char를 jni를 통해서 java에서 풀 방법이 없는거 같구요.
.c(.so)에서 utf-8이든 uincode든 먼저 convert 해준 후 그걸 java쪽으로 던져줄수밖에 없을꺼 같은데요.
.c(.so) linux 환경에서는 iconv가 없다고 하던군요. icu라고 있는 것 같던데.. 아직까진 그걸 모르겠습니다.
결론은 java도 utf-8(또는 unicode) 로 jni(utf-8) .c(.so)도 utf-8로 서로 맞춰주고 데이타를 연동해야할거 같습니다. 그렇지않고는
전혀 방법이 없는듯합니다.
다른 분들.. 혹 java <=> jni <=> .c(.so) .c(.so)에서 tcp/ip 소켓통신 한 후(ansi) 그 데이타를 java로 정상적으로
받으신 분의 지도편달 좀 부탁드립니다. hex로도 안돼고 .c(.so)에선 utf-8, unicode로 바꿀 방법이 없구.. 난감하네요.
아시는 분의 답글 좀 부탁드립니다.
테스트 해보니 java와 jni .c(.so) 끼리는 utf-8을 통한(jni) 한글데이타 send, recive는 잘되더군요..
java 는 unicode
jni jstring은 utf-8
.c(.so)는 ansi(소켓통신) 입니다.
java 에서 string을 하나 만든 후 그걸 jni 통해서 .c(.so)로 전달하면 한글이 깨지지않고 잘 전달됩니다.
또 .c(.so)에서 java에서 던진 string을 char에 복사한 후 다시 jni 통해서 java로 던지면 한글이 잘 출력됩니다.
한데 .c(.so)에서 소켓통신으로 받은 char(ansi) 코드를 java쪽으로 jni통해서 던지면..
한글이 죽어도 깨집니다. java쪽에서 KSC5601로 디코딩해도 깨지더군요..
jni통하면서 한글이 깨져버리는지.. 그래서 .c(.so)에서 hex로 convert 후 java쪽으로 던져줬습니다.
hex는 어차피 숫자이니 변할께 없죠.. java쪽에서 정확히 hex코드를 받았습니다.
그걸 다시 hex to string으로 변경 하니 똑같이 한글이 깨지더군요..
의문이 hex로 변경한 char(ansi)가.. (전 jni 통하면서 utf-8로 강제적으로 변경돼서 한글이 깨지는가했는데.. => 아직도 이렇다고 생각함)
근데 hex로 변경 한 내용이 정확히 java쪽으로 전달돼고 그걸 java에서 hex to string으로 변경하니 똑같이 깨지는겁니다...
hex가 다시 ansi코드로 원복되는가보네요. 그래서 hex to string한걸 디코딩 해줘봤습니다. 그래도 한글이 정상적으로 복원이
안되는데요.
.c(.so)에서 ansi로 된 char를 jni를 통해서 java에서 풀 방법이 없는거 같구요.
.c(.so)에서 utf-8이든 uincode든 먼저 convert 해준 후 그걸 java쪽으로 던져줄수밖에 없을꺼 같은데요.
.c(.so) linux 환경에서는 iconv가 없다고 하던군요. icu라고 있는 것 같던데.. 아직까진 그걸 모르겠습니다.
결론은 java도 utf-8(또는 unicode) 로 jni(utf-8) .c(.so)도 utf-8로 서로 맞춰주고 데이타를 연동해야할거 같습니다. 그렇지않고는
전혀 방법이 없는듯합니다.
다른 분들.. 혹 java <=> jni <=> .c(.so) .c(.so)에서 tcp/ip 소켓통신 한 후(ansi) 그 데이타를 java로 정상적으로
받으신 분의 지도편달 좀 부탁드립니다. hex로도 안돼고 .c(.so)에선 utf-8, unicode로 바꿀 방법이 없구.. 난감하네요.
아시는 분의 답글 좀 부탁드립니다.
2010.05.17 15:52:47
음.. 일단 해결은 했는데요. 다시 한번 .c(.so)에선 hex로 변경하고 그 hex를 16비트 처리해서 그걸 euc-kr로 string 디코딩해줬네요.
일단 두개로 비교를 해봤는데 하나는 hex로 넘겨서 위의 내용대로 디코딩 한글로 변환해줬고..
또 하나는 같은 내용을 hex로 변형하지않고 jobjectarray로 넘겨준 후 그 깨진 한글을 euc-kr로 디코딩해줘봤는데 이건 한글이 여전히 복원이 안돼네요. 일단은 hex를 16비트 로 변형 후 euc-kr로 디코딩하는 방법으로 처리는 했는데..
쩝.. jobjectarray로 던져준 데이타도 디코딩이 될꺼 같은데.. 끙.. 왜 안될까.. 그게 되면 좀더 쉽게 받을텐데 말이죠..
답변 감사드립니다~
일단 두개로 비교를 해봤는데 하나는 hex로 넘겨서 위의 내용대로 디코딩 한글로 변환해줬고..
또 하나는 같은 내용을 hex로 변형하지않고 jobjectarray로 넘겨준 후 그 깨진 한글을 euc-kr로 디코딩해줘봤는데 이건 한글이 여전히 복원이 안돼네요. 일단은 hex를 16비트 로 변형 후 euc-kr로 디코딩하는 방법으로 처리는 했는데..
쩝.. jobjectarray로 던져준 데이타도 디코딩이 될꺼 같은데.. 끙.. 왜 안될까.. 그게 되면 좀더 쉽게 받을텐데 말이죠..
답변 감사드립니다~
2010.07.06 16:01:53
저는 native(jni)쪽에서 char배열을 그대로 NewDirectByteBuffer로 넘기게끔 하고 (어차피 void* 캐스팅되니까요)
그다음 android쪽에서 ByteBuffer로 받은 데이터를 CharsetDecoder를 이용해서 처리했습니다.
http://myfact.tistory.com/7 이곳을 보시면 사용법은 나와있습니다.
저같은 경우는 native쪽이 KSC5601이어서
아래와 같은 식으로 처리했습니다.
Charset charset = Charset.forName("KSC5601");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer oCharBuffer;
oCharBuffer = decoder.decode(a_oBuffer);