Acessar dll (.Net C#) com JNA

2 respostas
J

Caros colegas do mundo Java!

Tenho um programa implementado para acessar uma DLL (feita em .Net com C#), onde, basicamente, passo uma String para validação.

A DLL é feita por terceiros e o projeto principal já usa JNA para interfacear essa troca de informações com as DLLs.

Ao executar o programa, tenho a seguinte exceção:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'ValidaString': Não foi possível encontrar o procedimento especificado.

	at com.sun.jna.Function.<init>(Function.java:126)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:219)
	at com.sun.jna.Library$Handler.invoke(Library.java:191)
	at $Proxy0.ValidaString(Unknown Source)
	at <pacote>.StringValidator.main(StringValidator.java:93)

A interface que mapeia os métodos da DLL, está assim:

package <pacote>;

import com.sun.jna.Native;

/**
 * Essa interface utiliza uma DLL para validação da String. 
 * 
 * @author junio.fernandes
 * @version $Revision: 1.1.2.1 $
 */
public interface IfcStringValidator extends com.sun.jna.win32.StdCallLibrary
{
   public static final IfcStringValidator INSTANCE = (IfcStringValidator ) Native.loadLibrary(
      "StringValidator", IfcStringValidator .class);
   
   public boolean ValidaString(String texto);
   
   public enum TipoDoc 
   {
      TEXTO, A4;
   }
}

A classe que implementa toda a validação necessária, possui o seguinte método que acessa a DLL por meio da interface descrita acima:

public boolean isValid()
   {
      boolean valido = false;
      
      try
      {
         IfcStringValidator stringValidator = IfcStringValidator.INSTANCE;
         
         if (this.texto != null)
         {
            valido = stringValidator.ValidaString(this.texto);
         }
      }
      catch (Exception e)
      {
         logger.error(e.getMessage(), e);
      }
      
      return (valido);
   }

Já vi por aí que há problema no acesso a DLLs com JNA, quando essa DLL é feita com .Net, mas nada conclusivo.

Aprecio e agradeço as colaborações e sugestões dos colegas!

2 Respostas

T

Uma DLL em .NET não expõe métodos que possam ser acessados via JNA. Você precisará provavelmente de adquirir ou achar um produto semelhante a este aqui:

http://www.jnbridge.com/

Um artigo sobre esse produto é este aqui: http://www.devx.com/interop/Article/19945

Outra forma é escrever uma DLL em C++/CLR que instancie essa DLL escrita em .NET e exporte uma função C que você possa acessar via JNA (ou então que implemente uma interface JNI). Isso é um bocadinho complicado, e se você não tiver um expert em C++/CLR e JNI na sua equipe, talvez seja de manutenção muito complexa. Acho mais barato comprar o tal produto.

J

thingol:
Uma DLL em .NET não expõe métodos que possam ser acessados via JNA. Você precisará provavelmente de adquirir ou achar um produto semelhante a este aqui:

http://www.jnbridge.com/

Um artigo sobre esse produto é este aqui: http://www.devx.com/interop/Article/19945

Outra forma é escrever uma DLL em C++/CLR que instancie essa DLL escrita em .NET e exporte uma função C que você possa acessar via JNA (ou então que implemente uma interface JNI). Isso é um bocadinho complicado, e se você não tiver um expert em C++/CLR e JNI na sua equipe, talvez seja de manutenção muito complexa. Acho mais barato comprar o tal produto.

Obrigado!!!

Vou passar para avaliação da equipe!

Criado 2 de junho de 2009
Ultima resposta 2 de jun. de 2009
Respostas 2
Participantes 2