programing

register Natives() 메서드는 무엇을 합니까?

firstcheck 2022. 8. 7. 16:42
반응형

register Natives() 메서드는 무엇을 합니까?

Java에서 프라이빗 스태틱메서드는 무엇입니까?registerNatives()오브젝트 클래스에서는요?

다른 답변은 기술적으로 정확하지만 JNI 경험이 없는 사람에게는 그다지 도움이 되지 않습니다. :- )

일반적으로 JVM이 네이티브 기능을 검색하려면 특정 방법으로 이름을 지정해야 합니다. 예를 들어, 다음과 같습니다.java.lang.Object.registerNatives대응하는 C 함수의 이름은 다음과 같습니다.Java_java_lang_Object_registerNatives를 사용하여registerNatives(또는 JNI 기능)RegisterNativesC 함수에 원하는 이름을 붙일 수 있습니다.

다음은 관련된 C 코드입니다(OpenJDK 6).

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를 내장하고 있고 애플리케이션 자체의 함수에 링크하고 싶은 경우(공유 라이브러리 내의 함수가 아닌 경우), 또는 사용되는 함수는 일반적으로 표준 메서드 룩업 메커니즘에 의해 발견되지 않기 때문에 "export"되지 않는 경우에도 유용합니다.네이티브 함수 등록은 네이티브 메서드를 다른 C 함수로 "리바인드"하기 위해서도 사용할 수 있습니다(예를 들어 프로그램에서 모듈의 동적 로드 및 언로딩을 지원하는 경우 유용합니다).

JNI의 책도 꼭 읽어보시길 권합니다.이 책에는 이런 내용이 담겨 있습니다. :-)

조금 혼란스러울 수 있는 것은, 다음에 나타내는 코드입니다.java.lang.Object.registerNatives앞의 답변은 네이티브 함수를 등록하는 방법의 에 불과합니다.이것은 (OpenJDK 구현에서) 클래스 객체의 네이티브 함수를 등록하는 코드입니다.자신의 클래스에 네이티브 함수를 등록하려면 JNI 함수를 호출해야 합니다.RegisterNatives자신의 라이브러리에 있는 네이티브 코드에서 찾을 수 있습니다.이것은 약간 원형처럼 들릴 수 있지만, 루프를 끊는 몇 가지 방법이 있습니다.

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

    a. Java 클래스에서 네이티브 메서드(가능하면 static)를 선언합니다.registerNatives(또는 다른 이름).상관없습니다.)

    b. 네이티브 코드로 다음 함수를 정의합니다.Java_<your fully qualified class name>_registerNatives여기에는 JNI 함수에 대한 콜이 포함됩니다.RegisterNatives.

    코드에서 c. Java가 "Java"인지 합니다.registerNatives 메서드에대한 호출됩니다.

또는

  1. JNI_OnLoad

    a를 합니다. 네이티브 라이브러리에서 함수를 정의합니다.jint JNI_OnLoad(JavaVM *vm, void *reserved)를 JNI 함수로 RegisterNatives.

    으로 b. Java VM을 하여 호출합니다.JNI_OnLoad System.loadLibrary필요한 것env를 합니다.GetEnv에서 vm

다음과 같은 장면에서 사용됩니다.

C하고, 로 기능합니다 load C 、 C + + 、 Java 、 JVM 、 JVM の c c c 。(C ★★★)jvm.dll를 사용합니다.JNI_CreateJavaVMJVM ★★★★★★★★★★★★★★★★★★★」

가 호스트의 C 를 호출할 필요가 , dll(Java " " " " C " " " " " " " " " " " jni dl " " " " )를 계속 .System.loadLibrary("foo.dll");네이티브 Java 메서드를 바인드하기 위해 dll의 메모리 공간이 C 호스트와 동일하지 않습니다(호스트 상태와 무관한 함수는 계속 작동하지만 이 방법으로는 호스트의 상태 값에 액세스할 수 없습니다).

여기 사용하셔야 합니다.env->RegisterNatives()JVM(바인드, 내보내기, 내보내기)을 사용하다

언급URL : https://stackoverflow.com/questions/1010645/what-does-the-registernatives-method-do

반응형