JNI (Java Native Interface)
Android가 관리 Code에서 Compile하는 Byte code(Java 또는 Kotlin)와
Native Code(C/C++)가 상호작용하는 방법을 정의
Android는 자바 프로그래밍 언어와 비슷한 방식으로 Kotlin을 ART 친화적인 바이트 코드로 컴파일하기 때문에 JNI 아키텍처 및 관련 비용 측면에서 이 페이지의 지침을 Kotlin 및 자바 프로그래밍 언어 둘 다 적용
JavaVM 및 JNIEnv
JNI는 두 개의 주요 데이터 구조인 'JavaVM'과 'JNIEnv'를 정의/ 함수 테이블에 대한 포인터의 포인터
JavaVM : JavaVM을 만들고 삭제할 수 있는 '호출 인터페이스' 함수를 제공/ Android에서는 하나만 허용
JNIEnv : 대부분의 JNI 함수를 제공. 네이티브 함수는 모두 JNIEnv를 첫 번째 인수로 받음
JNIEnv : 스레드 로컬 저장소에 사용. 따라서 스레드 간에 JNIEnv를 공유할 수 X
UTF-8 및 UTF-16 문자열
자바 프로그래밍 언어는 UTF-16을 사용
UTF-8 및 UTF-16 문자열
자바 프로그래밍 언어는 UTF-16 사용. 편의상, JNI는 Modified UTF-8에서도 작동하는 메서드 제공
수정된 인코딩은 \u0000을 0x00이 아닌 0xc0 0x80으로 인코딩하기 때문에 C 코드에 유용
이 경우 표준 libc 문자열 함수에 사용하기 적합한 C 스타일 0 종료 문자열을 사용할 수 있다(장점)
임의의 UTF-8 데이터를 JNI로 전달하여 올바르게 작동할 것으로 기대할 수 없다(단점)
가능한 경우, 일반적으로 UTF-16 문자열로 작업하는 것이 더 빠름.
Android에서는 현재 GetStringChars에는 사본이 필요하지 않지만 GetStringUTFChars에는 할당 및 UTF-8로의 변환 필요
참조
https://developer.android.com/training/articles/perf-jni?hl=ko