jni callback 예제

C 프로그램 대신 위의 예제에서 C++ 프로그램(HelloJNI.cpp라고 함)을 사용할 수 있습니다. 이 예제에서는 헤더 파일을 “포함” 하위 디렉토리 아래에 배치하기로 결정했습니다. 생성된 출력은 “포함myjni_HelloJNI.h”입니다. 프로그램의 수명 동안 변경되지 않고 여러 스레드에서 안전하게 사용할 수 있는 항목을 캐시하는 전역 변수를 사용하는 것이 유용합니다. 이러한 것 들 중 하나는 JVM 핸들입니다. 필요할 때마다 검색할 수 있지만(예: Android:AndroidRuntime::getJavaVM)을 사용하여) 변경되지 않으므로 캐시하는 것이 좋습니다. 이 시점에서 Java 함수는 Java에서 시작된 스레드 또는 네이티브 코드에서 시작된 네이티브 스레드에서 호출될 수 있으며 JVM에는 지식이 없는 두 가지 가능성이 있음을 인식하는 것이 중요합니다. 전자의 경우 호출이 직접 수행 될 수 있으며 후자의 경우 먼저 기본 스레드를 JVM에 연결해야합니다. 이를 위해서는 두 경우 모두 올바른 작업을 수행하는 네이티브 콜백 처리기인 추가 계층이 필요합니다. 또한 네이티브 스레드를 만드는 함수가 필요하므로 구조적으로 구현은 다음과 같습니다 : “-h dir”옵션은 C / C ++ 헤더를 생성하고 지정된 디렉토리에 배치합니다 (위의 예에서 현재 디렉터리의 `.`).

효율적으로 VM, 개체 및 메서드에 대한 참조를 캐시합니다. 즉, 콜백당 작업 감소가 됩니다. 모든 JNI 메서드는 로컬 및 전역 참조를 인수로 허용합니다. 동일한 개체에 대한 참조에 다른 값이 있을 수 있습니다. 예를 들어 동일한 개체에서 NewGlobalRef에 대한 연속 호출의 반환 값이 다를 수 있습니다. 두 참조가 동일한 개체를 참조하는지 확인하려면 IsSameObject 함수를 사용해야 합니다. 네이티브 코드에서 참조를 ==와 비교하지 마십시오. CXXFLAGS 및 LDFLAGS의 예를 들어 Android 도구 체인을 사용하여 공유 라이브러리를 만드는 데 사용해야 하는 경우 예제 프로젝트 타볼에 포함된 Makefile을 확인하십시오. 그들은 안드로이드 소스에서 빌드 / 코어 / 콤보 / linux-arm.mk에서 파생됩니다.

C ++ 또는 C 코드에서 메시지를 전달하기 위해 test_string_callback_fom_c 함수를 사용하여 등록() 메서드에서 캐시된 참조를 사용하는 실제 콜백을 사용합니다. 여기에 꽤 많은 일이 일어나고 있다. 콜백이 다른 스레드에 있기 때문에 VM 컨텍스트는 현재 스레드에 연결되어야 합니다. 이 문서는 문맹 퇴치 프로그래밍 도구인 noweb을 사용하여 소스에서 생성되었습니다. JNIExample.nw는 노웹 형식의 소스입니다. 다양한 형식(예: PDF)으로 문서 출력을 생성하고 JNI 예제 소스 코드를 생성하는 데 사용할 수 있습니다. 나머지는 네이티브 함수를 호출하고 결과를 표시하여 네이티브 라이브러리에서 제공하는 기능을 보여 줍니다. callVoid() 데모의 경우 먼저 처리기를 초기화하고 JNI 인터페이스 클래스에 전달하여 콜백 메시지를 받을 수 있도록 해야 합니다. 예를 들어 win32 메시지 펌프에서 이벤트 처리.

isCopy 플래그를 확인하는 한 가지 이유는 배열을 변경한 후 JNI_COMMIT을 사용하여 릴리스를 호출해야 하는지 여부를 확인하는 것입니다. 플래그를 확인하는 또 다른 가능한 이유는 JNI_ABORT를 효율적으로 처리하기 위한 것입니다. 예를 들어 배열을 가져옵니다, 장소에서 수정, 다른 함수에 조각을 전달 하 고 변경 내용을 삭제 할 수 있습니다. JNI가 새 복사본을 만드는 경우 다른 “편집 가능한” 복사본을 만들 필요가 없습니다. JNI가 원본을 전달하는 경우 자신의 복사본을 만들어야합니다. *isCopy가 false인 경우 릴리스 호출을 건너뛸 수 있다고 가정하는 것은 일반적인 실수(예제 코드에서 반복)입니다.

Sorry, comments are closed for this post.