JNI e Java:formiga chamando fazer ou fazer chamada formiga?
-
08-06-2019 - |
Pergunta
Estou prestes a fazer minha primeira viagem ao mundo do JNI (Java Native Interface) para fornecer notificações de alteração do sistema de arquivos do código C/C++ específico da plataforma para Java.A menos que alguém sugira alguma biblioteca brilhante para fazer isso que eu perdi.
Sendo novo no JNI, consegui encontrar muita documentação sobre o lado da interface e sobre a geração de bibliotecas, mas não encontrei muita coisa sobre como construir a biblioteca nativa.
Eu tenho uma compilação existente baseada em ant para a fonte Java pré-existente, então estou tentando descobrir se devo fazer com que o ant chame make para criar a biblioteca ou se é melhor fazer com que o make chame o ant depois de criar a biblioteca?
Nenhuma das opções parece terrivelmente boa, mas ambas parecem melhores do que tentar fazer com que o ant chame um compilador para compilar o código e gerar a biblioteca diretamente.
Solução
Eu não gosto muito de make por causa de seu conjunto de regras implícito e do tratamento de espaços em branco.Pessoalmente, eu usaria tarefas cpp (http://ant-contrib.sourceforge.net/cpptasks/index.html) para fazer minha compilação C.Eles não são tão flexíveis quanto o make, mas também são muito menos complexos e isso significa que você não terá que sobrecarregar seus desenvolvedores com o aprendizado do make.
Outras dicas
Como alternativa mais simples ao JNI, experimente o JNA: https://jna.dev.java.net/, pode resolver esse incômodo para você e ser mais simples (supondo que possa fazer o que você deseja).
Eu pularia totalmente o JNI e usaria um programa externo que grava notificações na saída padrão.Java pode então simplesmente ler o fluxo de saída do programa e gerar qualquer evento necessário.JNI dá muito trabalho se tudo o que você deseja é enviar notificações simples.
Além disso, no Linux você pode simplesmente iniciar "inotifywait" (com alguns parâmetros adequados, consulte "man inotifywait").
Estou trabalhando em algo semelhante agora.Esteja ciente de que usar o swig do swig.org geralmente é mais fácil, pois ele gera os stubs para a biblioteca nativa para você.
A resposta curta à sua pergunta é que o arquivo ant deve executar o arquivo make após a biblioteca java já ter sido construída, pois a biblioteca nativa depende do cabeçalho gerado pelo swig, que é gerado a partir dos arquivos de classe java.
Se você está super familiarizado com o ant e não quer aprender um novo sistema, então http://ant-contrib.sourceforge.net/cpptasks/index.html, também vinculado por outro postador, permitirá que você construa c++ em ant.
Você também pode tentar as tarefas terp C++ em Codemesh.Eles não são gratuitos, mas oferecem um alto nível de abstração juntamente com a capacidade de descobrir/especificar o compilador C++ e a capacidade de iterar em mais de um compilador/arquitetura de processador/configuração do compilador para compilações multiplataforma.