jni_onload 예제

내 예에서 나는 네이티브 코드와 안드로이드 응용 프로그램을 작성하는 안드로이드 스튜디오를 사용하고 있습니다. 안드로이드에서 당신은 JNI를 사용하기 위해 NDK를 설치해야합니다. 많은 JNI 호출은 예외를 throw할 수 있지만 종종 실패를 확인하는 더 간단한 방법을 제공합니다. 예를 들어 NewString이 NULL이 아닌 값을 반환하는 경우 예외를 확인할 필요가 없습니다. 그러나 CallObjectMethod와 같은 함수를 사용하여 메서드를 호출하는 경우 예외가 throw된 경우 반환 값이 유효하지 않으므로 항상 예외를 확인해야 합니다. 이 예제에서는 obj에 대 한 클래스 개체를 검색 하 고 함수 getNum의 메서드 개체를 매개 변수로 가져와 정수를 반환 하는 함수의 메서드 개체를 가져옵니다. 우리가 할 마지막 일은 개체 obj를 사용하여 해당 함수를 호출하고 Android 응용 프로그램 또는 기타 일반 자바 응용 프로그램을 작성하는 동안 매개 변수로 +b를 보내고 때로는 C / C ++에서 코드를 작성해야합니다. Java는 모든 배열 액세스, 모든 형식 캐스트, 함수 호출 및 반환 등에 대한 많은 보안 검사를 제공하는 동적 언어입니다. 이러한 검사는 성능에 영향을 미치며 이미지를 조작하려면 C로 작성하는 것이 좋습니다. 연결된 스레드는 적절한 양의 작업을 수행할 수 있는 충분한 스택 공간이 있어야 합니다.

스레드당 스택 공간 할당은 운영 체제에 따라 다릅니다. 예를 들어 pthread를 사용하면 pthread_attr_t 인수에서 pthread_create에 스택 크기를 지정할 수 있습니다. 모든 JNI 메서드는 로컬 및 전역 참조를 인수로 허용합니다. 동일한 개체에 대한 참조에 다른 값이 있을 수 있습니다. 예를 들어 동일한 개체에서 NewGlobalRef에 대한 연속 호출의 반환 값이 다를 수 있습니다. 두 참조가 동일한 개체를 참조하는지 확인하려면 IsSameObject 함수를 사용해야 합니다. 네이티브 코드에서 참조를 ==와 비교하지 마십시오. 관리되는 코드와 네이티브 코드 모두에서 원시 데이터의 큰 버퍼에 액세스해야 하는 상황에 처할 수 있습니다.

일반적인 예로는 비트맵 또는 사운드 샘플의 조작이 있습니다. 두 가지 기본 방법이 있습니다. 다음은 JDK/JRE에서 Java VM을 만드는 예제 코드입니다: 참조를 네이티브 코드의 전역 변수에 저장하고 다른 호출 중에 사용하려면 JDK/JRE 1.2로 각 클래스 로더가 자체 네이티브 라이브러리 집합을 관리합니다. 동일한 JNI 네이티브 라이브러리를 두 개 이상의 클래스 로더에 로드할 수 없습니다. 이렇게 하면 불만족링크오류가 throw됩니다. 예를 들어 System.loadLibrary는 네이티브 라이브러리를 두 개의 클래스 로더에 로드하는 데 사용할 때 불만족LinkError를 throw합니다. 새로운 접근 방식의 장점은 다음과 같습니다 :이 방법을 사용하면 모든 함수를 호출 할 수 있지만 쓰기가 복잡합니다 (이 예제와 같은 개인 함수를 호출 할 수도 있음) Hello,속도 향상은 어떻습니까? “긴 이름”을 가진 방법보다 빠합니까? 예를 들어 초당 60번 호출되는 게임 루프에 더 적합합니까? 다음 코드 예제에서는 호출 API에서 함수를 사용하는 방법을 보여 줍니다.