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.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts