문제

Java에서는 개인 정적 방법은 무엇입니까? registerNatives() 객체 클래스의 do?

도움이 되었습니까?

해결책

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

일반적으로 JVM이 귀하의 기본 기능을 찾으려면 특정 방식으로 선정되어야합니다. 예를 들어, java.lang.Object.registerNatives, 해당 C 함수의 이름이 지정됩니다 Java_java_lang_Object_registerNatives. 사용하여 registerNatives (또는 오히려 JNI 기능 RegisterNatives), 당신은 원하는대로 C 기능을 지정할 수 있습니다.

다음은 관련 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를 포함시키고 응용 프로그램 자체 내의 함수에 링크하려는 경우 (공유 라이브러리 내에서와 달리) 사용중인 기능은 그렇지 않으면 "내보내기"가 아니기 때문에 유용합니다. 일반적으로 표준 방법 조회 메커니즘에 의해 찾을 수 없습니다. 기본 기능 등록을 사용하여 다른 C 함수에 기본 방법을 "반창"하는 데 사용될 수도 있습니다 (예 : 프로그램이 동적으로로드 및 언로드 모듈을 지원하는 경우 유용합니다.

나는 모두가 읽어 보라고 권장한다 JNI 책, 이것은 이것에 대해 훨씬 더 이야기합니다. :-)

다른 팁

약간 혼란 스러울 수있는 것은 java.lang.Object.registerNatives 이전 답변에서는 단지 대답입니다 예시 기본 기능을 등록하는 방법 이것은 (OpenJDK의 구현에서) 클래스 객체에 대한 기본 함수를 등록하는 코드입니다. 자신의 클래스에 대한 기본 기능을 등록하려면 JNI 기능을 호출해야합니다. RegisterNatives 자신의 라이브러리의 기본 코드에서. 이것은 약간 원형으로 들릴 수 있지만 루프를 깨는 몇 가지 방법이 있습니다.

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

    ㅏ. Java 클래스에서 이름이 지정된 기본 방법 (바람직하게는 정적)을 선언합니다. registerNatives (또는 다른 이름. 중요하지 않습니다).

    비. 기본 코드에서 이름이 지정된 함수를 정의하십시오 Java_<your fully qualified class name>_registerNatives, JNI 기능에 대한 호출이 포함되어 있습니다 RegisterNatives.

    씨. Java 코드에서 Java가 registerNatives 방법은 다른 기본 메소드를 호출하기 전에 호출됩니다.

또는

  1. 사용 JNI_OnLoad

    ㅏ. 기본 라이브러리에서 기능을 정의합니다 jint JNI_OnLoad(JavaVM *vm, void *reserved). 이 기능의 본문에서 JNI 기능을 호출하십시오. RegisterNatives.

    비. Java VM은 자동으로 찾고 전화합니다 JNI_OnLoad 기본 라이브러리가로드 된 경우 System.loadLibrary, 이미 수업의 정적 이니셜 라이저에서 이미 전화해야합니다. (필요한 것을 얻습니다 env 호출하여 포인터 GetEnv 테이블에서 기능 vm 포인터가 가리 킵니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top