jni callback 예제

이제 register() 메서드에서 캐시된 참조를 사용하는 실제 콜백입니다. 여기에 꽤 많은 일이 일어나고 있다. 콜백이 다른 스레드에 있기 때문에 VM 컨텍스트는 현재 스레드에 연결되어야 합니다. Java 콜백과 UI 스레드 간의 통신을 활성화하는 데 필요한 가져오기: “-h dir” 옵션은 C/C++ 헤더를 생성하고 지정된 디렉토리에 배치합니다(위의 예에서는 현재 디렉터리의 경우 `.`). 이 예제에서는 헤더 파일을 “포함” 하위 디렉토리 아래에 배치하기로 결정했습니다. 생성된 출력은 “포함myjni_HelloJNI.h”입니다. *isCopy가 false인 경우 릴리스 호출을 건너뛸 수 있다고 가정하는 것은 일반적인 실수(예제 코드에서 반복)입니다. 이것은 사실이 아닙니다. 복사 버퍼가 할당되지 않은 경우 원래 메모리를 고정해야 하며 가비지 수집기에서 이동할 수 없습니다. 네이티브 코드에서 인스턴스 및 정적 메서드를 콜백할 수 있습니다.

정적 메서드를 콜백하려면 GetStaticMethodID(), 호출정적Method(), 콜정적보이드방법() 또는 콜정적오브젝트메소드()를 사용합니다. 즉시 메서드에 대한 참조를 계산하고 저장합니다. 즉, 콜백을 수행하는 데 필요한 작업 수가 줄어듭니다. 많은 JNI 호출은 예외를 throw할 수 있지만 종종 실패를 확인하는 더 간단한 방법을 제공합니다. 예를 들어 NewString이 NULL이 아닌 값을 반환하는 경우 예외를 확인할 필요가 없습니다. 그러나 CallObjectMethod와 같은 함수를 사용하여 메서드를 호출하는 경우 예외가 throw된 경우 반환 값이 유효하지 않으므로 항상 예외를 확인해야 합니다. 프로그램의 수명 동안 변경되지 않고 여러 스레드에서 안전하게 사용할 수 있는 항목을 캐시하는 전역 변수를 사용하는 것이 유용합니다. 이러한 것 들 중 하나는 JVM 핸들입니다. 필요할 때마다 검색할 수 있지만(예: Android:AndroidRuntime::getJavaVM)을 사용하여) 변경되지 않으므로 캐시하는 것이 좋습니다. 첫 번째 단계는 C ++ 코드가 콜백을 사용하도록 자바 코드에 대한 참조를 얻을 수있는 “레지스터”메서드를 사용하는 것입니다.

안녕하세요, 이 것을 시도했지만 JNI 중 하나에서 이것을 호출하려고 할 때 {error: “`콜백`이 이 범위에서 선언되지 않았습니다”}. 효율적으로 VM, 개체 및 메서드에 대한 참조를 캐시합니다. 즉, 콜백당 작업 감소가 됩니다.