web-dev-qa-db-fra.com

Chargement DLL en Java - Eclipse - JNI

J'essaye de charger une dll en Java en utilisant le code suivant System.loadLibrary ("mydll");

Le projet est placé dans D:\development\project\et j’ai placé la DLL sur D :. J'ai ensuite donné l'argument suivant VM dans la configuration Eclipse -Djava.library.path = D: /

Mais quand je cours je reçois UnsatisifiedLinkerError . Après avoir googlé un peu, j’ai utilisé System.load ("D:\mydll.dll");

mais encore une fois, avoir le même problème, quelqu'un pourrait-il aider?

10
x.509

Si vous spécifiez le DLL nom_fichier dans le chemin de la bibliothèque, omettez-le. De plus, votre appel System.loadLibrary doit simplement être "mydll". Je peux vous dire (par expérience) que si vous mettez le DLL à la racine de votre projet dans Eclipse (c.-à-d. D:\Eclipse Workspace\Proj), il devrait. Toute erreur supplémentaire liée à l'éditeur de liens peut provenir de problèmes de dépendance liés à la recherche d'autres DLL. L'exception est la même. Utilisez quelque chose comme Dependency Walker ( http://www.dependencywalker.com/ ) pour voir si votre DLL s'appuie sur autre chose que le chemin d'accès à la bibliothèque système.

Edit: UnsatisfiedLinkError : Émis si la machine virtuelle Java ne peut pas trouver une définition appropriée en langage natif d'une méthode déclarée native - il semble que vous utilisiez une fonction JNI qui n'existe pas.

8
Chris Dennett

Découvrez comment configurer correctement les dépendances natives ici . De plus, assurez-vous d'utiliser la machine virtuelle Java correcte: dans mon cas, la DLL n'a pas été trouvée car il s'agissait d'une DLL 32 bits, mais j'ai utilisé la machine virtuelle x64!

4
mcanti

Un problème que vous avez est: System.load ("D:\mydll.dll"); Devrait être System.load ("D: \\ mydll.dll" ) ou System.load ("D: /mydll.dll");

J'ai eu plus de succès avec System.load, mais loadlibrary est mieux conçu pour la multiplateforme. Il calcule l'extension pour vous.

3
user1332994

Utiliser System.loadLibrary("mydll") fonctionne bien, vous pouvez aussi utiliser celui-là. Si vous avez utilisé javah et que vous pensez qu'avec votre DLL tout va bien, il existe deux possibilités:

  1. La machine virtuelle Java ne trouve pas votre DLL : Dans ce cas, le chemin de votre bibliothèque Java n'est pas correct (ce dont je doute) et vous devez probablement le définir sur . et placer votre DLL dans le répertoire de travail actuel.
  2. La machine virtuelle Java ne trouve pas de DLL votre DLL dépend de : Si vous avez des bibliothèques dépendantes dans votre DLL, elles sontPASsont recherchées par la machine virtuelle Java, mais par Windows lui-même. Et Windows ne connaissant pas le Java.library.path, il recherchera dans la variable système PATH. Si vous en avez la possibilité, vous pouvez définir la variable système PATH sur l'emplacement de vos DLL avant de démarrer la machine virtuelle Java et tout ira bien. Ou vous pouvez charger toutes vos DLL en utilisant la JVM comme ceci

    System.loadLibrary ("dll_1");
    System.loadLibrary ("dll_2");
    System.loadLibrary ("dll_3");

    dll_3.dll dépend de dll_2.dll, qui dépend de dll_1.dll.

J'espère que cela pourra aider.

3
David Sauter

Mettez votre Almafa.dll dans le répertoire C:/Java/jre7/lib ou/bin désolé, je ne me souviens pas exactement. Une fois que vous n’avez plus fait de configuration, dites simplement 

static{ System.LoadLibrary("Almafa"); }

dans la classe, où vous voulez le charger. Il ne fonctionne que dans le projet Java, dans Android comme projet, vous devez utiliser JNI. J'avais posté maintenant le résultat de 3 jours sans dormir :)

1
Karoly

System.loadLibrarycharge le DLL à partir du chemin de la JVM (chemin bin JDK).

Si vous voulez charger un fichier explicite avec un chemin, utilisezSystem.load()

Voir aussi: Différence entre System.load () et System.loadLibrary en Java

public class MyClass
{
    static 
    {
        System.load("MyJNI.dll");
    }
}
0
Yochai Timmer

@ alee- Vous pouvez simplement copier et coller les fichiers dll dans le dossier system32 de vos fenêtres et essayer d'appeler la bibliothèque via la System.loadLibrary ("mydll") ... Je suppose que cela peut fonctionner ...

0
Navin

Indiquer le chemin de la bibliothèque dans votre projet comme emplacement de la bibliothèque native, semble avoir été résolu.

0
Ibin Joy

J'ai résolu mon erreur en utilisant les éléments suivants:

   static {
    try {
        System.loadLibrary("myDLL");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Au lieu d'utiliser System.load("myDLL.dll")

0
Mansi