Jna

Gostaria de colocar o que for relacionado a JNA, neste espaço.

Estou com 2 duvidas:

  1. Estou tendo dúvidas sobre como utilizar JNA quando um metodo do meu codigo da dll(por exemplo) retorna um Objeto ou um array.
    Os exemplos que vi o metodo retorna int e String ou nao retorna nada (void).

Entao cito abaixo um exemplo do que estou falando:

  • O que tem na especificacao da minha dll
    Caex.BullTool.Framework.User.IDriver

  • Dentro da classe IDriver tem o metodo (assinatura do metodo na documentacao)
    string [] Caex.BullTool.Framework.User.IDriver.Probe ( )

  • No java fiz assim:
    public class DllExample {
    public interface Framework extends Library {
    public String [] Probe ();
    }

    public static void main(String[] args) {
    Framework libFramework = (Framework) Native.loadLibrary(“C://Marcelo//teste//framework”, Framework.class);
    libFramework.Probe();
    }
    }

Isso ja me gera um erro:
Exception in thread “main” java.lang.UnsatisfiedLinkError: Error looking up function ‘Probe’: Não foi possível encontrar o procedimento especificado.

  1. Na especificacao da dll existem diversas classes como abaixo:
  • Caex.BullTool.Framework.User.IInfrastruc
    exemplo de metodos da Classe IInfrastruc
    uint [] Caex.BullTool.Framework.User.IInfrastruct.Query(string field,object value)
    List Caex.BullTool.Framework.User.IInfrastruct.ConfigSyncd ( uint uid )

Imagine que existe outra classe com o mesmo nome dos metodos que citei. Como eu faço para dizer o metodo de uma classe no java?

Agradeço a ajuda.
[]´s
Marcelo

Você não pode chamar uma DLL .NET usando JNA. Você precisa usar uma solução de terceiros, normalmente paga. Procure na Internet por “java .net bridge”.

Essa resposta me surpreendeu! O JNA não serve para acessar qualquer biblioteca de terceiros?
Qualquer dll feita em .Net não será possivel a não ser por biblioteca de terceiros? É isso mesmo!?
Fiz um exemplo basico acessando Kernel32.dll e funcionou.

O Entanglement não quis dizer isso. A JNA (assim como a JNI) possuem suporte à chamar bibliotecas nativas que foram escritas em C ou C++. Ela não permite, pelo menos não diretamente, acessar bibliotecas escritas em outras linguagens. Para isso, você precisará usar uma solução de um terceiro. Java não possui nativamente uma forma de chamar uma biblioteca desenvolvida em C# ou Delphi, por exemplo. Uma forma de fazer isso é implementar uma DLL em C++ que use os recursos da biblioteca na linguagem que você quer chamar e usar essa DLL no Java através de JNA ou JNI. Isso é extremamente difícil de ser feito, por causa das incompatibilidades que podem haver entre as linguagens. Além do que nem é certo de que funcione corretamente.
No caso do kernel32.dll, este foi escrito em C e por isso pode ser chamado via JNA ou JNI.
Fazer uma aplicação em Java chamar uma biblioteca escrita em C ou C++ já é algo que pode dar uma dor de cabeça desgraçada dependendo do tamanho da aplicação, imagina em outras linguagens. Por isso que se deve recorrer à uma solução de um terceiro.
Abs.