2017-09-04 2 views
0

내 JNI 코드는 을 외부 소스에서 받아 jstring jStr = env->NewStringUTF(src)을 사용하여 String으로 변환하고 jStr 결과를 상위 Java 계층에 전달합니다.JNI : Catch NewStringUTF 내부 예외

일부 입력 src 값은 (NewStringUTF에 호출 이내) 다음과 같은 런타임 오류가 발생할 수 :

    : 내가 할 수있는 "캐치"이 해 NewStingUTF 에러/예외 사용되는 방법의

    A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xf8 
    A/art: art/runtime/java_vm_ext.cc:470]  string: 'radio abcdefg ���� ����� ��� ����' 
    A/art: art/runtime/java_vm_ext.cc:470]  input: '0x72 0x61 0x64 0x69 0x6f 0x20 0x62 0x72 0x65 0x73 0x6c 0x65 0x76 0x20 <0xf8> 0xe3 0xe9 0xe5 0x20 0xe1 0xf8 0xf1 0xec 0xe1 0x20 0xf7 0xe5 0xec 0x20 0xe4 0xf0 0xe7 0xec' 
    A/art: art/runtime/java_vm_ext.cc:470]  in call to NewStringUTF 
    

    없음

  • NewStringUTF 호출 후에 if (env->ExceptionCheck() == JNI_TRUE)을 배치하십시오.
  • NewStringUTF 호출 후에 if (env->ExceptionOccurred())을 배치합니다.
  • NewStringUTF에 대한 호출을 try...catch 블록으로 경계합니다.

참고 : 문제는 (이 응용 프로그램을 충돌하지 않도록, 그 제어 미치는 영향에 의해), 그리고 유용 할 수 있지만 (그 해결에 반드시 예외을 잡기 에 초점을 맞추고).

저는 NDK v15.2와 함께 Android Studio v2.3.3 (최신 날짜)을 사용하고 있습니다.

귀하의 도움이 많이 필요합니다.

+0

예외는 가정이 틀렸다는 것을 알려줍니다. –

+0

아마도 강조되지 않았지만 문제는 ** 예외를 잡는 데 초점을 맞추고 있습니다. ** 또한 영향을 제어하여 응용 프로그램을 손상시키지 않습니다. 아마도 'NewStringUTF'에서 실행 된 하위 레벨 코드 때문에 충돌이 발생했을 가능성이 있습니까? – Bliss

+1

문서 작성자는 문자열을 작성하는 중에 오류가 발생하면'NewStringUTF'가 NULL을 반환한다고 말합니다. 어쩌면 그게 전부입니다 : NULL을 확인하고 당신을 제외하고 아무도 볼 수없는 디버그 출력을 무시하십시오. – user2543253

답변

1

텍스트 데이터 형식은 텍스트입니다.

데이터가 char * 텍스트를 통해 전달되고 있습니까?

텍스트가 아니라 인코딩 된 텍스트가 있습니다.

텍스트의 문자 인코딩은 무엇입니까?

NewStringUTF : 수정 된 UTF-8 인코딩으로 문자 배열에서 새로운 java.lang.String 객체를 생성합니다.

Android 텍스트는 표준 UTF-8이되는 경향이 있습니다. 이것은 Windows-1255 (히브리어)처럼 보이지만 작가 만 말할 수 있습니다.

에 관계없이 해결책은 Java 문자 인코딩 기능을 사용하여 인코딩 된 텍스트를 바이트 배열에서 Java 문자열 (UTF-16)로 변환하는 것입니다. JNI를 통하는 것보다는 Java로 그러한 메소드를 호출하는 것이 더 쉽다. 따라서 데이터 흐름에 맞으면 char *을 jbyteArray에 복사 한 다음 다시 Java로 전달합니다. 여기서 관련 인코딩을 사용하여 쉽게 텍스트 데이터 유형으로 변환 할 수 있습니다.