registerNatives () 메소드는 무엇을합니까?
Java registerNatives()
에서 Object 클래스 의 개인 정적 메소드 는 무엇을합니까?
다른 답변은 기술적으로 정확하지만 JNI 경험이없는 사람에게는 그다지 유용하지 않습니다. :-)
일반적으로 JVM이 기본 함수를 찾으려면 특정 방식으로 이름을 지정해야합니다. 예를 들어, java.lang.Object.registerNatives
해당 C 함수의 이름은 Java_java_lang_Object_registerNatives
. registerNatives
(또는 오히려 JNI 함수 RegisterNatives
) 를 사용하여 원하는대로 C 함수의 이름을 지정할 수 있습니다.
다음은 OpenJDK 6의 관련 C 코드입니다.
static JNINativeMethod methods[] = {
{"hashCode", "()I", (void *)&JVM_IHashCode},
{"wait", "(J)V", (void *)&JVM_MonitorWait},
{"notify", "()V", (void *)&JVM_MonitorNotify},
{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},
{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},
};
JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
(*env)->RegisterNatives(env, cls,
methods, sizeof(methods)/sizeof(methods[0]));
}
( Object.getClass
목록에 없다는 점에 유의 하십시오. 여전히 "표준"이름 인으로 호출됩니다 Java_java_lang_Object_getClass
.) 나열된 함수의 경우 관련 C 함수는 해당 표에 나열된 것과 같으며, 이는 여러 전달 함수를 작성하는 것보다 편리합니다.
네이티브 함수를 등록하는 것은 C 프로그램에 Java를 임베드하고 애플리케이션 자체 내의 함수에 링크하려는 경우 (공유 라이브러리 내 에서와는 반대) 또는 사용중인 함수가 그렇지 않은 경우 "내보내기"되지 않는 경우에도 유용합니다. 일반적으로 표준 메서드 조회 메커니즘에서 찾을 수 없습니다. 네이티브 함수 등록은 네이티브 메서드를 다른 C 함수로 "리 바인드"하는 데 사용할 수도 있습니다 (예를 들어 프로그램이 동적으로 모듈로드 및 언로드를 지원하는 경우 유용함).
나는 모든 사람들 이 이것에 대해 이야기 하는 JNI 책 을 읽을 것을 권장 합니다. :-)
약간 혼란 스러울 수있는 java.lang.Object.registerNatives
것은 이전 답변에서 표시된 코드 가 네이티브 함수를 등록하는 방법 의 예일 뿐이라는 것입니다. 이것은 (OpenJDK 구현에서) 클래스 Object에 대한 기본 함수를 등록하는 코드입니다. 자신의 클래스에 대한 네이티브 함수를 등록하려면 RegisterNatives
자신의 라이브러리에있는 네이티브 코드에서 JNI 함수 를 호출해야합니다 . 이것은 약간 원형으로 들릴 수 있지만 루프를 끊는 몇 가지 방법이 있습니다.
이 Object 클래스 구현의 예를 따르십시오.
ㅏ. Java 클래스에서 이름이 지정된 기본 메소드 (정적 선호)를 선언하십시오
registerNatives
(또는 다른 이름. 상관 없음).비. 네이티브 코드
Java_<your fully qualified class name>_registerNatives
에서 JNI 함수에 대한 호출을 포함하는 라는 함수를 정의 합니다RegisterNatives
.씨. Java 코드에서
registerNatives
다른 원시 메소드를 호출하기 전에 Java 메소드가 호출 되는지 확인하십시오 .
또는
사용하다
JNI_OnLoad
ㅏ. 네이티브 라이브러리에서 함수를 정의하십시오
jint JNI_OnLoad(JavaVM *vm, void *reserved)
. 이 함수의 본문에서 JNI 함수를 호출하십시오RegisterNatives
.비. Java VM은
JNI_OnLoad
네이티브 라이브러리가에 의해로드 될 때 자동으로 찾아 호출 합니다.이 라이브러리는System.loadLibrary
클래스의 정적 초기화 프로그램에서 이미 호출해야합니다. ( 포인터가 가리키는 테이블env
에서GetEnv
함수를 호출 하여 필요한 포인터를 얻습니다vm
.)
참고 URL : https://stackoverflow.com/questions/1010645/what-does-the-registernatives-method-do
'Programing' 카테고리의 다른 글
Python 패키지의 종속성을 찾는 방법 (0) | 2020.11.15 |
---|---|
표현 트리의 실제 사용 (0) | 2020.11.15 |
.join ()이 함수 인수와 함께 작동하지 않는 이유는 무엇입니까? (0) | 2020.11.15 |
인라인 vs __inline vs __inline__ vs __forceinline? (0) | 2020.11.15 |
Android SQLite의 "_id"필드 정보 (0) | 2020.11.15 |