Introdução detalhada ao processo de registro da função java jni
Quando chamamos o código nativo em Java, geralmente é implementado através do JNI. Precisamos apenas carregar o arquivo local da biblioteca .So na classe Java, declarar o método nativo e depois chamá -lo onde ele precisa ser chamado. Quanto à implementação específica do método nativo em Java, tudo é entregue à camada nativa. Qual é o pré -requisito para nós chamarmos corretamente as funções correspondentes no código local em Java? A resposta é estabelecer uma correspondência individual entre métodos nativos em Java e funções no código local por meio de determinados mecanismos. Então, o que é esse mecanismo? É o mecanismo de registro das funções JNI.
Existem duas maneiras de registrar as funções JNI, uma é o método de registro estático e o outro é o método de registro dinâmico. Vamos apresentar esses dois métodos de implementação abaixo.
1. Registro estático.
1. Princípio da implementação: estabeleça uma correspondência individual entre um método Java e uma função JNI com base no nome da função.
2. Processo de implementação:
Code Código Java de escrita;
② Compile o código Java e gerar arquivos .class;
③ Use a diretiva Javah para gerar arquivo jni .h usando o arquivo .class gerado;
④ O arquivo de cabeçalho JNI gerado contém a declaração das funções Java na camada JNI;
3. Desvantagens:
① A escrita é muito inconveniente porque os nomes das funções da camada JNI devem seguir um formato específico e os nomes são particularmente longos;
② Isso causará muito trabalho para programadores, porque os arquivos do cabeçalho da JNI devem ser gravados para todas as classes Java que declaram funções nativas;
③O programa está em execução ineficiente, porque ao chamar uma função nativa pela primeira vez, você precisa procurar a função local correspondente na camada JNI de acordo com o nome da função e, em seguida, estabelecer um relacionamento correspondente. Esse processo é demorado.
2. Registro dinâmico.
1. Princípio da implementação: diga diretamente à função nativa seu ponteiro para a função correspondente no JNI;
2. Processo de implementação:
① Use a estrutura Jninativemethod para salvar a correspondência entre as funções nativas de Java e as funções JNI;
② Salvar a correspondência entre todas as funções nativas e funções JNI em uma matriz Jninativemethod;
Após carregar a biblioteca dinâmica do JNI através do System.LoadLibrary em Java, chame a função jni_onload e inicie o registro dinâmico;
④O AndroidRuntime :: Registernativemethods Função será chamada em JNI_ONLOAD para registro de função;
⑤A chamada final para JniregisternativeMethods em AndroidRuntime :: Registernativemethods Complete o registro completo.
3. Vantagens: Superando as desvantagens do registro estático.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!