Pergunta

Em java, o que o método estático privado registerNatives() da classe Object fazer?

Foi útil?

Solução

As outras respostas são tecnicamente correto, mas não é muito útil para alguém sem experiência JNI. : -)

Normalmente, para que a JVM para encontrar suas funções nativas, eles têm que ser chamado de uma certa maneira. por exemplo, para java.lang.Object.registerNatives, a função C correspondente é chamado Java_java_lang_Object_registerNatives. Usando registerNatives (ou melhor, a função RegisterNatives JNI), você pode nomear suas funções C que quiser.

Aqui está o código C associado (do 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]));
}

(Note que Object.getClass não está na lista;., Ainda será chamado pelo nome de "padrão" de Java_java_lang_Object_getClass) Para as funções listadas, as funções C associados estão listados na tabela, que é mais acessível do que escrevendo um monte de funções de encaminhamento.

Registrando funções nativas também é útil se você está embutindo o Java em seu programa C e quer link para funções dentro do próprio aplicativo (ao contrário de dentro de uma biblioteca compartilhada), ou as funções que está sendo usado não são de outra maneira "exportado" , uma vez que estas não seriam normalmente encontrados pelo mecanismo de pesquisa de métodos padrão. Registam funções nativas, também pode ser utilizado para "religação" um método nativo para outra função C (útil se o seu programa suportes dinamicamente carga e descarga de módulos, por exemplo).

Eu encorajo todo mundo a ler o JNI livro , que fala sobre isso e muito mais. : -)

Outras dicas

O que pode ser um pouco confuso é que o código mostrado para java.lang.Object.registerNatives em uma resposta anterior é apenas um exemplo de como registrar funções nativas. Este é o código que (na implementação do OpenJDK) registra funções nativas para a classe de objeto. Para registrar funções nativas para sua própria classe, você deve chamar o RegisterNatives função JNI do código nativo em sua própria biblioteca. Isto pode soar um pouco circular, mas existem algumas maneiras de quebrar o ciclo.

  1. Siga o exemplo desta implementação da classe Object:

    a. Em sua classe Java, declarar um método nativo (de preferência estática) chamado registerNatives (ou qualquer outro nome. Não importa).

    b. No seu código nativo, defina uma função chamada Java_<your fully qualified class name>_registerNatives, que contém uma chamada para o RegisterNatives função JNI.

    c. Certifique-se de que em seu código Java, o seu método registerNatives Java é chamado antes de quaisquer chamadas para outros métodos nativos.

ou

  1. Use JNI_OnLoad

    a. Em sua biblioteca nativa definir uma função jint JNI_OnLoad(JavaVM *vm, void *reserved). No corpo desta função, chamar a função RegisterNatives JNI.

    b. O Java VM irá procurar automaticamente e JNI_OnLoad chamada quando sua biblioteca nativa é carregado por System.loadLibrary, que você já deve estar chamando, provavelmente em um inicializador estático para a sua classe. (Você começa o ponteiro env necessário chamando a função GetEnv na tabela que o ponteiro aponta vm a.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top