Portabilidade e JNI [RESOLVIDO]

1. Portabilidade e JNI [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 05/10/2015 - 09:15h

Queria saber se um código escrito em C++ e usando JNI para ser usado com Java, mantém a portabilidade do Java, ou seja, compilo uma vez e rodo em qualquer lugar.
Mais uma coisa, uma vez vi um código C++ que tinha sido "portado" para Java com JNI, o código estava compilado numa biblioteca ".so", então, se for usar o programa no windows não precisarei transformar o código em dll?
E por exemplo, se eu compilo para android com JNI, só poderei rodar o código em certos aparelhos, pois a biblioteca foi compilada para uma plataforma específica (ARM no caso) e o programa só vai poder rodar nessa plataforma especifica?



  


2. Re: Portabilidade e JNI [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 05/10/2015 - 09:28h

SamL escreveu:

Queria saber se um código escrito em C++ e usando JNI para ser usado com Java, mantém a portabilidade do Java, ou seja, compilo uma vez e rodo em qualquer lugar.
Mais uma coisa, uma vez vi um código C++ que tinha sido "portado" para Java com JNI, o código estava compilado numa biblioteca ".so", então, se for usar o programa no windows não precisarei transformar o código em dll?
E por exemplo, se eu compilo para android com JNI, só poderei rodar o código em certos aparelhos, pois a biblioteca foi compilada para uma plataforma específica (ARM no caso) e o programa só vai poder rodar nessa plataforma especifica?


Sam Sam Sam...

A portabilidade só será mantida se for feita pra mesma arquitetura, tipo, foi compilado em x32 e executado x32.

Você presisará converter o código pra .dll, pois o .so é só do Mundo Unix. (Mas acho que é só fazer a mesma coisa que é feita com as bibliotecas do Linux e só colocar a saida pra .dll => não tenho certeza)

Android com JN será só para a mesma plataforma. Meu celular é x32, mas emula nativamente o ARM, ou seja, roda apps do ARM, e achar do apps x32 é complicado.

Espero ter ajudado

Se ajudei, marque o tópico como resolvido e clique em melhor resposta.

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"




3. Re: Portabilidade e JNI

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/10/2015 - 14:21h

O N em JNI significa “nativa”. Aquela interface terá de ser compilada para cada plataforma em que tiver de ser executada pois. Se não fosse assim, não seria nativa.

Contudo, observe que o “nativo” não depende só da arquitetura e do SO. Se minha máquina tem, por exemplo, um Linux com arquitetura amd64 instalado, mas eu escolhi (ou fui forçado a) usar uma JVM i686, rodando em modo de compatibilidade, a biblioteca com a JNI tem de ser compatível com a JVM, isto é, também tem de ser compilada como i686 para poder ser carregada e entendida pela JVM (do mesmo modo como eu provavelmente tenho também de ter uma libc i686 para que a própria JVM possa começar a executar).


4. Re: Portabilidade e JNI [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/10/2015 - 12:37h

SamL escreveu:

Valeu pessoal, sanaram todas as dúvidas.
Pelo visto terei de portar manualmente toda minha engine de C++ para Java, pois me parece melhor para aproveitar a portabilidade do Java.


E por que você não a faz portável em C++ mesmo?

O Qt, por exemplo, é um exemplo de framework que permite ao mesmo código ser compilado em qualquer plataforma. Tudo bem que, ao contrário de Java, você terá de ter um executável e/ou bibliotecas para cada plataforma destino, mas não dependerá de JVM e terá todas as vantagens do código nativo.


5. Re: Portabilidade e JNI [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/10/2015 - 09:49h

Bom, minha experiência com desenvolvimento para Android é nula. Até o que li a respeito é pouquíssimo.

Se a sua plataforma destino é Android, parece-me que pelo menos algum pedaço do seu código terá de ser em Java, nem que seja só para dar um kick-off da aplicação. Note, porém, que um dos objetivos declarados do Android NDK (de Native Development Kit) é justamente não ter de reescrever bibliotecas que já estejam prontas em outras linguagens, especialmente C e C++.

Não sei de que se trata o seu engine. Contudo, meu chute é que de você possivelmente faria a interface com o usuário com a API primária do Android, que é em Java, e o seu engine em C++ para o processamento nos bastidores.

Se, de todo, você abominar Java, há alternativas. Uma que me vem à mente é programar com Qt5, usando C++ e QML. Eu também nunca testei isso, mas o pessoal do Qt se gaba muito do nível de portabilidade que essa configuração permite, a saber, desktop (vários SOs), tablets (Android 4.2+, IOS, WinRT) e portáteis (Andoid 4.2+, IOS, WinRT) e possivelmente outras coisas. Mas, de novo, eu nunca testei nada disso,e não posso colocar minha mão no fogo como sendo uma panaceia.