jni 함수 등록 과정

JNI 함수를 등록하는 방법에는 정적 등록과 동적 등록 두 가지가 있으며 해당 코드는 다음과 같습니다.

정적 등록:
여기에 이미지 설명 삽입

정적으로 등록된 메서드 이름은 Java_로 시작합니다.

동적 등록:
여기에 이미지 설명 삽입

동적 등록은 RegisterNatives 메서드를 호출하여 등록됩니다.

정적 등록

이 두 가지 등록 방법의 등록 과정을 이해하는 것이 vmp를 배우기 위한 전제 조건입니다.다음은 먼저 정적 등록 과정을 분석합니다.

여기에 이미지 설명 삽입

클래스를 불러올 때 먼저 클래스 정보를 얻고 속성과 메서드가 있으면 LoadClassMembers를 호출하여 클래스를 불러옵니다.

여기에 이미지 설명 삽입

LoadClassMembers 메소드의 앞부분은 정적 속성과 인스턴스 속성을 불러오는 부분이고, 후자는 인스턴스 메소드와 정적 메소드를 불러오는 부분인데 위 사진에서는 메소드 로딩만 올렸습니다. 소스 코드에서 메서드를 로드하는 두 단계——LoadMethod, LinkCode가 있음을 알 수 있습니다.

여기에 이미지 설명 삽입

loadMethod는 매개변수에서 ArtMethod 인스턴스 객체를 초기화하는 것입니다.

여기에 이미지 설명 삽입

LinkCode의 전반부는 귀리 컴파일된 클래스인지, 인터프리터에 의해 해석되고 실행되어야 하는지를 판단합니다 강화 제조업체는 일반적으로 dex를 귀리로 컴파일하는 것을 차단하므로 ShouldUseInterpreterEntrypoint 메서드의 반환 값이 true여야 합니다.

여기에 이미지 설명 삽입

메소드가 네이티브 메소드인 경우 첫 번째 등록은 UnregisterNative()를 호출합니다. 이 메소드는 정적 등록이든 동적 등록이든 호출됩니다. 두 등록 방법의 차이점은 주로 두 번째 등록에 있습니다. 더 이상 말하지 않겠습니다. 보려면 이 방법을 입력하세요.

여기에 이미지 설명 삽입

코드는 매우 간단합니다.GetJniDlsymLookupStub()의 반환 값을 진입점으로 설정하십시오.GetJniDlsymLookupStub()의 반환 값은 무엇입니까?

여기에 이미지 설명 삽입

함수 포인터가 가리키는 주소가 반환됩니다 art_jni_dlsym_lookup_stub. 이 함수가 무엇인지 봅시다.

여기에 이미지 설명 삽입

이 함수가 어셈블리로 작성되었음을 알 수 있습니다. 암 32비트 코드를 열어 살펴보십시오.

여기에 이미지 설명 삽입

어셈블리 메서드는 artFindNativeMethod 메서드를 호출하고 후속 조치를 취하고 살펴봅니다.

여기에 이미지 설명 삽입

FindCodeForNativeMethod 메소드가 해당 메소드의 주소를 리턴하고, 2차 등록은 RegisterNative 메소드를 통해 이루어지며, 이는 정적 등록의 전 과정임을 주석에서 알 수 있다.

FindCodeForNativeMethod 메소드를 계속해서 따라하다 보면 정적 등록이 Java_로 시작하는 이유를 찾을 수 있을 것입니다.키 코드는 아래에 게시되어 있으며 관심있는 독자들이 스스로 공부할 수 있습니다.

여기에 이미지 설명 삽입

동적 등록

동적 등록의 경우 첫 번째 등록은 정적 등록의 첫 번째 등록 위치와 동일하며 둘 다 UnregisterNative() 메서드이며 동적 등록의 두 번째 등록은 주로 JNI_OnLoad 메서드를 통해 프로그래머가 작성합니다. RegisterNatives 메서드를 호출하여 등록하려면 아래 RegisterNatives 메서드의 구현을 따르세요.

여기에 이미지 설명 삽입

여기에 이미지 설명 삽입

이 메서드는 멤버가 JNINativeMethod 구조인 메서드 배열을 순회하고 해당 Java 이름, 서명 정보 및 구체적으로 구현된 함수 포인터를 가져옵니다.

여기에 이미지 설명 삽입

마지막으로 각 메서드가 RegisterNative에 등록되고 이제 동적 등록 프로세스가 완료됩니다.

요약하다

정적 등록 및 동적 등록의 첫 번째 등록은 UnregisterNative() 메서드를 호출하여 실현되고, 정적 등록의 두 번째 등록은 RegisterNative 메서드를 호출하여 이루어지며, 동적 등록의 두 번째 등록은 프로그래머가 능동적으로 호출하는 RegisterNatives 메서드입니다. 모두 등록 메서드 배열의 메서드를 사용하지만 마지막으로 RegisterNative 메서드를 호출하여 등록합니다.

추천

출처blog.csdn.net/weixin_56039202/article/details/125586328