mobile menu

The Arrow Newsletter

mobile menu

android jni 예제

다음 콘텐츠로 “jni/Android.mk”를 만듭니다. 그것은 실제로 당신의 네이티브 코드를 컴파일하기 위해 안드로이드에 의해 사용되는 makefile입니다이 예에서, 우리는 “포함”하위 디렉토리 아래에 헤더 파일을 배치하기로 결정했다. 생성된 출력은 “포함myjni_HelloJNI.h”입니다. 모든 스레드는 커널에 의해 예약 된 Linux 스레드입니다. 일반적으로 Thread.start를 사용하여 관리 코드에서 시작되지만 다른 곳에서 만든 다음 JavaVM에 연결할 수도 있습니다. 예를 들어 pthread_create로 시작된 스레드는 JNI AttachCurrentThread 또는 AttachCurrentThreadAsDaemon 함수와 함께 연결할 수 있습니다. 스레드가 연결될 때까지 JNIEnv가 없으며 JNI 호출을 할 수 없습니다. 두 번째 단계는 JNI 빌드 호환성을 추가하도록 프로젝트를 구성하는 것입니다. 다음 URL :http://jcenter.bintray.com/com/android/tools/build/gradle-experimental 가서 최신 gradle 실험 플러그인 버전을 찾을 수 있습니다. Gradle 빌드 파일에서 gradle 플러그인을 교체해야 합니다 : Android NDK의 공식 설명서는 모든 JNI 메서드가 로컬 및 글로벌 참조를 인수로 https://developer.android.com/ndk/guides/index.html. 동일한 개체에 대한 참조에 다른 값이 있을 수 있습니다. 예를 들어 동일한 개체에서 NewGlobalRef에 대한 연속 호출의 반환 값이 다를 수 있습니다.

두 참조가 동일한 개체를 참조하는지 확인하려면 IsSameObject 함수를 사용해야 합니다. 네이티브 코드에서 참조를 ==와 비교하지 마십시오. JNIEXPORT는 NDK_ROOT/플랫폼/android-9/아치 암/usr/포함/jni.h에 정의 되어 있습니다. JNIEXPORT는 기본 함수가 빌드된 바이너리(*.so 파일)의 동적 테이블에 표시되도록 하는 데 사용됩니다. 이러한 함수가 동적 테이블에 없는 경우 JNI는 해당 함수를 호출하는 함수를 찾을 수 없으므로 RegisterNatives 호출이 런타임에 실패합니다. 많은 JNI 호출은 예외를 throw할 수 있지만 종종 실패를 확인하는 더 간단한 방법을 제공합니다. 예를 들어 NewString이 NULL이 아닌 값을 반환하는 경우 예외를 확인할 필요가 없습니다. 그러나 CallObjectMethod와 같은 함수를 사용하여 메서드를 호출하는 경우 예외가 throw된 경우 반환 값이 유효하지 않으므로 항상 예외를 확인해야 합니다. 사용 가능한 CMake 변수의 전체 목록은 다음과 https://developer.android.com/ndk/guides/cmake.html#variables 관리되는 코드와 네이티브 코드 모두에서 원시 데이터의 큰 버퍼에 액세스해야 하는 상황에 처할 수 있습니다. 일반적인 예로는 비트맵 또는 사운드 샘플의 조작이 있습니다. 두 가지 기본 방법이 있습니다. isCopy 플래그를 확인하는 한 가지 이유는 배열을 변경한 후 JNI_COMMIT을 사용하여 릴리스를 호출해야 하는지 여부를 확인하는 것입니다.

플래그를 확인하는 또 다른 가능한 이유는 JNI_ABORT를 효율적으로 처리하기 위한 것입니다. 예를 들어 배열을 가져옵니다, 장소에서 수정, 다른 함수에 조각을 전달 하 고 변경 내용을 삭제 할 수 있습니다. JNI가 새 복사본을 만드는 경우 다른 “편집 가능한” 복사본을 만들 필요가 없습니다. JNI가 원본을 전달하는 경우 자신의 복사본을 만들어야합니다. C 프로그램 대신 위의 예제에서 C++ 프로그램(HelloJNI.cpp라고 함)을 사용할 수 있습니다. *isCopy가 false인 경우 릴리스 호출을 건너뛸 수 있다고 가정하는 것은 일반적인 실수(예제 코드에서 반복)입니다. 이것은 사실이 아닙니다. 복사 버퍼가 할당되지 않은 경우 원래 메모리를 고정해야 하며 가비지 수집기에서 이동할 수 없습니다. “-h dir” 옵션은 C/C++ 헤더를 생성하고 지정된 디렉토리에 배치합니다(위의 예에서는 현재 디렉터리의 경우 `.`). 직접 포인터 (위 참조)의 사용의 결과로 안드로이드 4.0 (아이스크림 샌드위치)까지, GetObjectRefType을 올바르게 구현하는 것은 불가능했습니다. 대신 약한 글로벌 테이블, 인수, 지역 주민 테이블 및 해당 순서대로 글로벌 테이블을 살펴보는 추론을 사용했습니다.

직접 포인터를 처음 찾았을 때 참조가 검사할 형식이라고 보고합니다.