Fabriqué en France Drapeau français

jni_onload 예제

내 예에서 나는 네이티브 코드와 안드로이드 응용 프로그램을 작성하는 안드로이드 스튜디오를 사용하고 있습니다. 안드로이드에서 당신은 JNI를 사용하기 위해 NDK를 설치해야합니다. 안드로이드 응용 프로그램 이나 다른 일반 자바 응용 프로그램을 작성하는 동안 당신은 때때로 C / C ++에서 코드를 작성해야합니다. Java는 모든 배열 액세스, 모든 형식 캐스트, 함수 호출 및 반환 등에 대한 많은 보안 검사를 제공하는 동적 언어입니다. 이러한 검사는 성능에 영향을 미치며 이미지를 조작하려면 C로 작성하는 것이 좋습니다. 다음 코드 예제에서는 호출 API에서 함수를 사용하는 방법을 보여 줍니다. 이 예제에서 C++ 코드는 Java VM을 만들고 Main.test라는 정적 메서드를 호출합니다. 명확성을 위해 오류 확인을 생략합니다. isCopy 플래그를 확인하는 한 가지 이유는 배열을 변경한 후 JNI_COMMIT을 사용하여 릴리스를 호출해야 하는지 여부를 확인하는 것입니다. 플래그를 확인하는 또 다른 가능한 이유는 JNI_ABORT를 효율적으로 처리하기 위한 것입니다. 예를 들어 배열을 가져옵니다, 장소에서 수정, 다른 함수에 조각을 전달 하 고 변경 내용을 삭제 할 수 있습니다.

JNI가 새 복사본을 만드는 경우 다른 « 편집 가능한 » 복사본을 만들 필요가 없습니다. JNI가 원본을 전달하는 경우 자신의 복사본을 만들어야합니다. JDK/JRE 1.2에서 각 클래스 로더는 자체 네이티브 라이브러리 집합을 관리합니다. 동일한 JNI 네이티브 라이브러리를 두 개 이상의 클래스 로더에 로드할 수 없습니다. 이렇게 하면 불만족링크오류가 throw됩니다. 예를 들어 System.loadLibrary는 네이티브 라이브러리를 두 개의 클래스 로더에 로드하는 데 사용할 때 불만족LinkError를 throw합니다. 새로운 접근 방식의 장점은 모든 스레드는 커널에 의해 예약된 Linux 스레드입니다. 일반적으로 Thread.start를 사용하여 관리 코드에서 시작되지만 다른 곳에서 만든 다음 JavaVM에 연결할 수도 있습니다.

예를 들어 pthread_create로 시작된 스레드는 JNI AttachCurrentThread 또는 AttachCurrentThreadAsDaemon 함수와 함께 연결할 수 있습니다. 스레드가 연결될 때까지 JNIEnv가 없으며 JNI 호출을 할 수 없습니다. 이 예제에서는 obj에 대 한 클래스 개체를 검색 하 고 함수 getNum의 메서드 개체를 매개 변수로 가져와 정수를 반환 하는 함수의 메서드 개체를 가져옵니다. 우리가 할 마지막 일은 개체 obj를 사용하여 해당 함수를 호출하고 매개 변수로 +b를 보내는 것입니다 때로는 네이티브 코드에서 스레드를 만들거나 예를 들어 작업을 비동기로 만들려면 네이티브 시스템 호출 또는 함수를 사용할 수 있습니다. : 이 메서드를 사용하면 모든 함수를 호출할 수 있지만 쓰기가 복잡합니다 (이 예제와 같은 개인 함수를 호출 할 수도 있음) 모든 JNI 메서드는 로컬 및 전역 참조를 인수로 모두 허용합니다. 동일한 개체에 대한 참조에 다른 값이 있을 수 있습니다. 예를 들어 동일한 개체에서 NewGlobalRef에 대한 연속 호출의 반환 값이 다를 수 있습니다. 두 참조가 동일한 개체를 참조하는지 확인하려면 IsSameObject 함수를 사용해야 합니다. 네이티브 코드에서 참조를 ==와 비교하지 마십시오. 이 예제에서는 API에서 세 가지 함수를 사용합니다. 호출 API를 사용하면 네이티브 응용 프로그램이 JNI 인터페이스 포인터를 사용하여 VM 기능에 액세스할 수 있습니다.

디자인은 넷스케이프의 JRI 임베딩 인터페이스와 유사합니다. 직접 포인터 (위 참조)의 사용의 결과로 안드로이드 4.0 (아이스크림 샌드위치)까지, GetObjectRefType을 올바르게 구현하는 것은 불가능했습니다.

MENU