Pergunta

Antecedentes: estamos projetando um aplicativo de física, que fará muitas análises de dados, mas nosso foco está integrando equipamentos eletrônicos físicos.

Basicamente eu gostaria de poder ligar raiz (É uma biblioteca de análise de big data do CERN escrita em C ++) Biblioteca escrita na biblioteca C ++ da Java. Basicamente, a capacidade de usar classes raiz do Java (e fazê -lo sem perder muito tempo para codificar o JNI Wrappers) é um showstopper para nós (se for difícil, provavelmente usaremos o QT).

Eu posso pensar em seguir os métodos

  • JNI - Como eu disse - não queremos escrever invólucros para todas as aulas. . .
  • JNA - JNA não fornece mapeamentos C ++, mas apenas C.
  • GOLE - Eu não usei, mas ouvi dizer que é difícil de usar.

Outras coisas que podem ser reveladoras: temos acesso ao código -fonte root, mas não queremos alterá -lo. Queremos que os resultados sejam portáteis. Gostaríamos de manter as bibliotecas gratuitas. E como eu disse - poderíamos usar grande parte do código raiz desde o início, sem barulho.

Foi útil?

Solução

Com qualquer opção, você precisará fazer algum embrulho. Embora você não queira escrever invólucros JNI para todas as aulas, você pode escrever classes de nível mais alto que abranjam grupos de métodos. Então você só precisa escrever invólucros para as classes de nível superior (essa abordagem também funciona para outros métodos, não apenas JNI).

Outras dicas

Escreva um pequeno aplicativo C ++ que lê em sua entrada do Stdin e grava uma saída para o STDOUT. Em seguida, execute o processo no aplicativo Java e leia a saída do stdout.

Esta é a melhor maneira de fazer isso sem JNI (e é muito fácil de fazer)

eu recomendaria Ferramenta de geração de interface DJinni do Dropbox. Eles o usam para seus aplicativos móveis de plataforma cruzada para gerar as interfaces entre a interface Java (Android) e Objective-C (iOS) e seu modelo de dados C ++.

O Facebook também usou para um de seus aplicativos. Então, eu suponho que é muito bem testado.

Veja a conversa deles no CPPCON Para uma visão geral do que faz. A interface entre Java e C ++ usando o JNI parece especialmente propensa a erros.

Jnieasy Suporta o mapeamento das classes C ++ para as classes Java Pojo, mas custa 399 €. Como você prefere bibliotecas gratuitas, você pode procurar soluções que usam algo como o CORBA. É a única maneira de ter classes C ++ mapeadas para as classes Java.

Editar: Você já considerou Jas3, é uma biblioteca Java semelhante à raiz?

Apenas um pensamento, mas você pode usar o Python, já que o root já o suporta? Você pode se tornar razoavelmente proficiente no tempo necessário para envolver o código para Java.

Considere usar C# em vez de Java. Se você já está familiarizado com o Java, mudar para C# é fácil e tem Apoio muito melhor para invocar o código nativo.

Que tal escrever as aulas/funções que você precisa em C ++, compilar e chamar EXEC () nelas de Java?

Sempre que você chama o código C ou C ++ de Java via JNI ou equivalente, você corre o risco de desestabilizar a plataforma Java devido a problemas com gerenciamento de memória e/ou segurança do encadeamento no lado C/C ++.

Antes de seguir a rota JNI, etc, acho que você deve considerar outras alternativas:

  • Tire o Java da equação e implemente inteiramente em C ++ (ou C ++ / CC# como alguém sugeriu).
  • Crie um aplicativo de linha de comando C ++ que faça a tarefa que você precisa fazer usando a biblioteca nativa e execute o aplicativo usando um dos java.lang.Runtime.exec métodos.
  • Crie um invólucro "servidor" em C ++ para a biblioteca que expõe a funcionalidade necessária como um protocolo personalizado e codifique o lado Java para conversar com o servidor usando HTTP, soquetes brutos, tubos ou qualquer nível de transporte for apropriado.

Todas as alternativas têm desvantagens, mas o JNI / JNA e similares; Veja o primeiro parágrafo.

EDIT: Quando você toma a decisão de usar o JNI / JNA em um sistema, é provável que haja consequências de longo prazo. Além da questão da estabilidade, você deve considerar a portabilidade (a biblioteca nativa funcionará no Windows, Linux etc.), criar problemas (é difícil construir bibliotecas nativas em formigas, etc.), questões de versões da plataforma (atualizará para Java 7 Quebrar alguma coisa?), Desenvolvedor Skills ("Joe" Quem a integração da JNI saiu - quem mais conhece Java, C ++ e JNI?). A soma dessas questões é (IMO) mais significativa do que o tempo necessário para fazer o desenvolvimento inicial.

Se for difícil, provavelmente estaremos usando o QT

Por que você não se concentra nisso? Até agora, você não mencionou nenhum motivo pelo qual Java deve ser preferido.

Se a maior parte é a RAIZ Fonte e o código que o chama, você provavelmente será muito mais rápido fazendo tudo no C ++.
Como você está bem com o QT, a interface do usuário não deve se preocupar.

editar:
Eu realmente não consigo ver nenhuma vantagem para a abordagem Java - você precisa portar grande parte da fonte para outras plataformas, você adiciona complexidade à camada de embrulho e tem mais dependências.

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