O que faz as registerNatives () método faria?
-
06-07-2019 - |
Pergunta
Em java, o que o método estático privado registerNatives()
da classe Object fazer?
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.
-
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 oRegisterNatives
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
-
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çãoRegisterNatives
JNI.b. O Java VM irá procurar automaticamente e
JNI_OnLoad
chamada quando sua biblioteca nativa é carregado porSystem.loadLibrary
, que você já deve estar chamando, provavelmente em um inicializador estático para a sua classe. (Você começa o ponteiroenv
necessário chamando a funçãoGetEnv
na tabela que o ponteiro apontavm
a.)