Programing

registerNatives () 메소드는 무엇을합니까?

lottogame 2020. 11. 15. 10:50
반응형

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 함수 호출해야합니다 . 이것은 약간 원형으로 들릴 수 있지만 루프를 끊는 몇 가지 방법이 있습니다.

  1. 이 Object 클래스 구현의 예를 따르십시오.

    ㅏ. Java 클래스에서 이름이 지정된 기본 메소드 (정적 선호)를 선언하십시오 registerNatives(또는 다른 이름. 상관 없음).

    비. 네이티브 코드 Java_<your fully qualified class name>_registerNatives에서 JNI 함수에 대한 호출을 포함하는 라는 함수를 정의 합니다 RegisterNatives.

    씨. Java 코드에서 registerNatives다른 원시 메소드를 호출하기 전에 Java 메소드가 호출 되는지 확인하십시오 .

또는

  1. 사용하다 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

반응형