Access.net dll via JNA en java


J'ai une dll.net 4.0 il a un espace de noms et dans cet espace de noms il y a une classe, je veux accéder aux procédures à l'intérieur de cette classe en utilisant jna.

J'ai inclus la jna.pot ainsi que la plate-forme.jar (au cas où) en utilisant maven, Mon code java ressemble à ceci

Interface MyConfiguration

import com.sun.jna.Library;

public interface MyConfiguration extends Library{
    public void callInterface();
}

Accès au code dll

MyConfiguration myAPI = (MyConfiguration) Native
                       .loadLibrary("dll/MyAPI.dll", MyConfiguration.class);
System.out.println("Interface Created");
System.out.println("Calling Interface");
myAPI.callInterface();

Mais je suis l'exception--->

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'myInterface': The specified procedure could not be found.

    at com.sun.jna.Function.<init>(Function.java:208)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:536)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:513)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:499)
    at com.sun.jna.Library$Handler.invoke(Library.java:199)
    at com.sun.proxy.$Proxy0.myInterface(Unknown Source)
    at foo.App.main(App.java:83)

J'ai vérifié la dll à l'aide de l'outil dll decompiler, et il a le appelé fonction, quelqu'un peut-il aider.

Author: VinayVeluri, 2014-03-21

1 answers

Dll utilisant l'outil dll decompiler

Vous devez utiliser une visionneuse PE (portable executable) pour rechercher des entrées dans la table d'exportation. (Dépend est un.)

La plupart des DLL.NET n'exportent pas les fonctions de cette façon. Quand ils le font, c'est via un mécanisme appelé Reverse P/Invoke, qui n'est pas pris en charge par la plupart des compilateurs de langage Microsoft.NET. Le langage C++/CLI a été conçu à cet effet.

Vous pourriez trouver un chemin plus court vers le succès avec un Java-.NET pont produit. Ou, un produit de pont Java-COM si la DLL. NET expose des classes en tant qu'objets COM. (Utilisez OLE/COM Object Viewer pour inspecter une DLL COM.)

Assurez-vous également que la DLL a le même bitness que votre processus JVM (par exemple, java.exe ou javaw.exe), sauf si vous utilisez comme objet COM hors processus.

 2
Author: Tom Blodget, 2014-03-23 03:53:50