Forum Main Page > [Tutoriais] - Java em Geral

JNI - Java Native Interface

Goto page 1

New Topic    Reply Message
  1. Comment Arrow




  1. cleuber_s
    Offline
    Posts: 210

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44



    Esta página exibe apenas os comentários deste tutorial, para ler o artigo, clique aqui.






  1. rodrigomaia
    Offline
    Posts: 3

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Olah,

    teu tutorial é muito bom... porem, ainda me resta um duvida...

    e se eu não puder alterar a dll ??? se essa dll é disponibilizada por alguem, e essa pessoa fez a dll sem pensar em JNI ??? esse é meu caso... ja li o tutorial da sun... mais ainda não sei se essa convensão, é obrigatoria ou simplesmente é padrão...

    seria interessante que sabendo a assinatura dos metodos, não importa a linguagem, o JNI poderia fazer isso sem que o programador conhecesse a linguagem nativa...

    existe como isso ser feito???
    _________________
    JavaFree.org




  1. cleuber_s
    Offline
    Posts: 210

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Infelizmente não há essa possibilidade, devido ao fato de o JNI ser um interface entre o java e uma linguagem qualquer. Para que o Java reconheça o código nativo é necessário estar implementanto os tipo(ou objetos) JNI.

    É importante que você tenha os fontes da biblioteca, e depois, apenas adeque aos padrões JNI.
    _________________
    JavaFree.org




  1. jrodrigues
    Offline
    Posts: 1338

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    rodrigomaia:
    Olah,

    teu tutorial é muito bom... porem, ainda me resta um duvida...

    e se eu não puder alterar a dll ??? se essa dll é disponibilizada por alguem, e essa pessoa fez a dll sem pensar em JNI ??? esse é meu caso... ja li o tutorial da sun... mais ainda não sei se essa convensão, é obrigatoria ou simplesmente é padrão...

    seria interessante que sabendo a assinatura dos metodos, não importa a linguagem, o JNI poderia fazer isso sem que o programador conhecesse a linguagem nativa...

    existe como isso ser feito???



    Na verdade, isso pode ser feito.
    Mas o programador precisa não só conhecer Java, mas outra linguagem para poder carregar uma biblioteca nativa através de outra.

    Basta na sua biblioteca nativa que será utilizada pela JNI você chamar os métodos da biblioteca nativa de terceiros.
    Ou seja, a idéia é criar um DLL Wrapper (ou Shared Object Wrapper) para sua biblioteca customizada.

    Porém, você precisa conhecer os métodos exportados pela sua biblioteca nativa. Não é difícil.

    Pra te ajudar com o desenvolvimento, existe um padrão chamado Peer Pattern.


    _________________
    Jean R. Rodrigues
    Oracle/J2EE Premium Support Engineer
    Instrutor Certificado Sun e Oracle (Especialista América Latina)
    Certified ScrumMaster




  1. Anunciante

    Comment Arrow




  1. cleuber_s
    Offline
    Posts: 210

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Realmente, pode ser criada um biblioteca que implenta o JNI, para carregar a outra que não usa.
    _________________
    JavaFree.org




  1. HumbertoJr
    Offline
    Posts: 251

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Eh


    Alguem pode me dizer qual é o comando equivalente ao que esta acima em GCC?(o que esta acima é do tutorial e é pra compilador VC somente)

    Pior que não lembro mesmo o comando no GCC pra criar DLLs.......
    _________________
    JavaFree.org
    0
    0
    0
    0
    0




  1. HumbertoJr
    Offline
    Posts: 251

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Eh

    HumbertoJr:



    Alguem pode me dizer qual é o comando equivalente ao que esta acima em GCC?(o que esta acima é do tutorial e é pra compilador VC somente)

    Pior que não lembro mesmo o comando no GCC pra criar DLLs.......



    Pior que acabei de lembrar,não sei se foi o correto:



    Consegui criar a dll sim mas quando dou o comando aparece é algo como isso:


    Será que foi erro do comando no GCC?Gerou errado a DLL,pois o codigo esta certo sim tanto é que testei com a DLL que foi disponibilizada em HlloWorld.zip e deu certo mas com a DLL que eu gero ai sim que da erro mostrado acima......enfim alguem pode me ajudar? :roll:
    _________________
    JavaFree.org
    0
    0
    0
    0
    0




  1. cleuber_s
    Offline
    Posts: 210

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Tente copiar os aquivos "jni.h" e "jni_md.h" do J2SDK, para o diretório INCLUDE do compilador C++. Depois gere a DLL novamente.
    _________________
    JavaFree.org




  1. HumbertoJr
    Offline
    Posts: 251

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    cleuber_s:
    Tente copiar os aquivos "jni.h" e "jni_md.h" do J2SDK, para o diretório INCLUDE do compilador C++. Depois gere a DLL novamente.



    Essa dica ja estava no tutorial e eu ja a tinha feito ,mesmo assim deu o erro listado acima
    _________________
    JavaFree.org
    0
    0
    0
    0
    0




  1. HumbertoJr
    Offline
    Posts: 251

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Eh

    HumbertoJr:

    HumbertoJr:



    Alguem pode me dizer qual é o comando equivalente ao que esta acima em GCC?(o que esta acima é do tutorial e é pra compilador VC somente)

    Pior que não lembro mesmo o comando no GCC pra criar DLLs.......



    Pior que acabei de lembrar,não sei se foi o correto:



    Consegui criar a dll sim mas quando dou o comando aparece é algo como isso:


    Será que foi erro do comando no GCC?Gerou errado a DLL,pois o codigo esta certo sim tanto é que testei com a DLL que foi disponibilizada em HlloWorld.zip e deu certo mas com a DLL que eu gero ai sim que da erro mostrado acima......enfim alguem pode me ajudar? :roll:



    Nossa nenhuma resposta nesses dias me fizeram virar uma noite(com Coca-cola ) fazendo uns testes ,lendo o manual do GCC e o bom e velho Google........

    Bom não me perguntem porque fiz isso mas o codigo correto no GCC pra gerar a DLL é


    Agora deu certo ..........!
    _________________
    JavaFree.org
    0
    0
    0
    0
    0




  1. flavialares
    Offline
    Posts: 10

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    EhBoa tarde!!

    Gostei muito do seu artigo publicado sobre JNI. Estou seguindo as etapas que vc fez, para que o meu código Java acesse bibliotecas em C++, só que está dando o seguinte erro:

    java.lang.UnsatisfiedLinkError: displayHelloWorld
    at hello.HelloWorld.displayHelloWorld(Native Method)
    Exception in thread "main" 0303

    Acho que não estou gerando a dll corretamente. O seu exemplo, igual a este, funciona.

    P.s: Estou utilizando o Visual C++.

    Poderia me ajudar?

    Muito Obrigada,

    Flávia




  1. flavialares
    Offline
    Posts: 10

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Oi pessoal,

    Obrigada , já consegui resolver meu problema.
    O problema não era com a geração da dll , e sim com a geração do .h.

    Muito Obrigada,

    Flávia




  1. flavialares
    Offline
    Posts: 10

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Oi pessoal,

    Aproveitando o artigo sobre JNI, é possível através do JNI, pegar uma estrutura em C++ e criar uma classe Java com esses dados do C++?

    Desde já agradeço,

    Flávia




  1. flavialares
    Offline
    Posts: 10

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Olá!!

    Com este artigo consegui ter acesso as funções do C pelo Java. Estou querendo saber se é possível ter acesso a estrutura do C, vamos supor que eu queira acessar do meu código Java o atributo nome do Código C++. Será que é possível?

    Obrigada,

    Flávia




  1. fabioviana
    Offline
    Posts: 26

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Ehola galera!

    estou fazendo uma aplicação jni e quando rodei o programa deu um erro:

    Quote:

    An unexpected exception has been detected in native code outside the VM.
    Unexpected Signal : EXCEPTION_PRIV_INSTRUCTION (0xc0000096) occurred at PC=0x77C0F62B
    Function=outp+0xB
    Library=C:\WINDOWS\system32\MSVCRT.dll

    Current Java thread:
    at sups.comunica.portas.PortaComm.writeOneByte(Native Method)
    at sups.comunica.portas.PortaComm.write(PortaComm.java:4
    at Serial.main(Serial.java:9)

    Dynamic libraries:
    0x00400000 - 0x0040B000 C:\j2sdk1.4.2_06\bin\javaw.exe
    0x7C900000 - 0x7C9B4000 C:\WINDOWS\system32\ntdll.dll
    0x7C800000 - 0x7C8FE000 C:\WINDOWS\system32\kernel32.dll
    0x77F50000 - 0x77FFB000 C:\WINDOWS\system32\ADVAPI32.dll
    0x77DB0000 - 0x77E41000 C:\WINDOWS\system32\RPCRT4.dll
    0x77D20000 - 0x77DB0000 C:\WINDOWS\system32\USER32.dll
    0x77E50000 - 0x77E96000 C:\WINDOWS\system32\GDI32.dll
    0x77BF0000 - 0x77C48000 C:\WINDOWS\system32\MSVCRT.dll
    0x08000000 - 0x08139000 C:\j2sdk1.4.2_06\jre\bin\client\jvm.dll
    0x76B20000 - 0x76B4E000 C:\WINDOWS\system32\WINMM.dll
    0x10000000 - 0x10007000 C:\j2sdk1.4.2_06\jre\bin\hpi.dll
    0x00840000 - 0x0084E000 C:\j2sdk1.4.2_06\jre\bin\verify.dll
    0x00850000 - 0x00869000 C:\j2sdk1.4.2_06\jre\bin\java.dll
    0x00870000 - 0x0087D000 C:\j2sdk1.4.2_06\jre\bin\zip.dll
    0x02C60000 - 0x02C68000 C:\eclipse\workspace\SupsJava\PortComm.dll
    0x76C70000 - 0x76C98000 C:\WINDOWS\system32\imagehlp.dll
    0x59EA0000 - 0x59F41000 C:\WINDOWS\system32\DBGHELP.dll
    0x77BE0000 - 0x77BE8000 C:\WINDOWS\system32\VERSION.dll
    0x76BD0000 - 0x76BDB000 C:\WINDOWS\system32\PSAPI.DLL

    Heap at VM Abort:
    Heap
    def new generation total 576K, used 123K [0x10010000, 0x100b0000, 0x104f0000)
    eden space 512K, 24% used [0x10010000, 0x1002ef08, 0x10090000)
    from space 64K, 0% used [0x10090000, 0x10090000, 0x100a0000)
    to space 64K, 0% used [0x100a0000, 0x100a0000, 0x100b0000)
    tenured generation total 1408K, used 0K [0x104f0000, 0x10650000, 0x14010000)
    the space 1408K, 0% used [0x104f0000, 0x104f0000, 0x104f0200, 0x10650000)
    compacting perm gen total 4096K, used 992K [0x14010000, 0x14410000, 0x18010000)
    the space 4096K, 24% used [0x14010000, 0x14108140, 0x14108200, 0x14410000)

    Local Time = Wed Apr 06 14:21:56 2005
    Elapsed Time = 0
    #
    # The exception above was detected in native code outside the VM
    #
    # Java VM: Java HotSpot(TM) Client VM (1.4.2_06-b03 mixed mode)
    #



    compilei a biblioteca dinamica com o comando:
    gcc -Wl,--kill-at, -I%JAVA_HOME%\include\win32 -I%
    JAVA_HOME%\include -shared PortComm.c -o PortComm.dll


    Alguém pode me ajudar???




  1. bslima
    Offline
    Posts: 1

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    sou usuario do windows,
    e uso o compilador da brolando
    tcpp 3.0v, pra rodar minhas aplicações
    então o que não ficou claro para mim neste tutorial
    é como gerar a .dll
    esse comnado eu coloco é no dos?
    ou aonde?
    se puderem me esclarecer ficarei grato




  1. ricardoamaral
    Offline
    Posts: 0

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    rodrigomaia:
    Olah,

    teu tutorial é muito bom... porem, ainda me resta um duvida...

    e se eu não puder alterar a dll ??? se essa dll é disponibilizada por alguem, e essa pessoa fez a dll sem pensar em JNI ??? esse é meu caso... ja li o tutorial da sun... mais ainda não sei se essa convensão, é obrigatoria ou simplesmente é padrão...

    seria interessante que sabendo a assinatura dos metodos, não importa a linguagem, o JNI poderia fazer isso sem que o programador conhecesse a linguagem nativa...

    existe como isso ser feito???




    Estou com o mesmo problema do Rodrigo.
    Preciso usar uma biblioteca de terceiro, que muito provavelmente não foi escrita nos padrões JNI.
    Vi a dica do JRodrigues, em criar uma biblioteca itermediária que converse com a outra biblioteca.

    Tenho algumas perguntas:
    1º) Alguém sabe como chamo uma dll em C ?
    2º) Tenho como saber em que linguagem uma dll foi compilada ?
    3º) Tenho como fazer uma engenharia reversa em uma dll ?

    Agradeço desde ja!




  1. rerodri84
    Offline
    Posts: 3

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44


    Pessoal,

    Estou desenvolvendo meu Trabalho de Conclusão de Curso e neste, vou precisar fazer balanceamento de carga.

    Alguém sabe se em Java ou em C existe alguma função ou método que me possibilite buscar informações do Hardware ? Mais especificamente do Processador e da Memória ! Preciso saber a frequência do processador e a quantidade de memória.

    Estou desenvolvendo uma aplicação distribuída em Java e, caso esta função seja em C, pretendo utilizar o JNI mesmo.

    Abraço galera e desde já obrigado

    Renan




  1. Lich King
    Offline
    Posts: 46

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    O comando para criar a dll só pode ser dado no windows?
    Não tem como fazer com q ele crie a .dll e o .so de uma só vez?
    _________________
    programmer.setFucked(user.isStupid() );




  1. chermont
    Offline
    Posts: 2

    Comment Arrow

    Publicado em: 10/04/2009 05:18:44

    Olá Galera,

    Tenho o seguinte header de uma função de uma dll em C++:



    Preciso chamar essa função numa aplicação em Java. Graças a esse tutorial já consigo chamar a dll no Java. Porém estou com dificuldade para receber os valores da função dado que eles são retornados através de ponteiros.
    Alguém tem uma idéia de como eu posso retornar as informações para o Java através do JNI sem ter que alterar a estrutura de return?

    Como eu fujo desses ponteiros dessa função e consigo enviar os parâmetros para o Java.

    a estrutura que eu tenho agora é:
    Em Java a função nativa esta assim declarada:



    e o JNI me gerou a seguinte header:


    Porém desta forma eu não tenho como enviar os parâmetros.
    Será que alguém pode me ajudar?

    Abraços




  1. Relacionados




  1. Anunciante





New Topic    Reply Message     Forum Main Page -> [Tutoriais] - Java em Geral


Goto page 1