en essayant de faire une dll « Bonjour mot » dans Visual Studio que Java Native Access accepte

StackOverflow https://stackoverflow.com/questions/2421767

  •  19-09-2019
  •  | 
  •  

Question

J'ai compilé avec succès ma bibliothèque sur Linux et Mac et utilisé avec Java Native Access. Malheureusement, rien que je ne semble fonctionner avec le compilateur Visual Studio et Java Native Access.

Je vais revenir à l'essentiel et d'essayer de créer une dll super simple dans Visual Studio que Java Native Access travailler avec, toute aide serait appréciée.

Voici GimmeFiveDll.c:

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

Voici SystemLibrary.java:

import com.sun.jna.Native;


public class SystemLibrary {

public static final SystemLibrary instance = new SystemLibrary();

    static {
        Native.register("GimmeFiveDll");
    }

    public native int gimmeFive();
}

Je l'ai déjà essayé de commutation de l'interface d'appel à stdcall dans Visual Studio. Je ne l'ai pas d'autres changements du nouveau projet de l'assistant de projet vide dll par défaut de la console win32. Dans l'exemple ci-dessus la dll résultant ne même pas exporter la fonction correctement selon dumpbin.exe /exports. Mon vrai projet ne les exporter correctement mais de toute façon je reçois toujours la même exception JNA:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'GimmeFiveDll': The specified module could not be found.

(Oui, je mets le GimmeFiveDll.dll dans System32. Oui, je suis en mesure d'utiliser la JNA pour accéder à d'autres dll dans System32 avec Windows).

Tout le monde veut me aider compléterai cet exemple minimaliste d'un dll créé par Visual Studio que la JNA aime?

Un grand merci.

Était-ce utile?

La solution

Après deux jours de me cogner la tête contre un mur, je compris. Le problème était que C: \ Windows \ System32 est pas un System.loadLibrary de répertoire () (qui Native.register () utilise) peut charger une dll sur une machine 64 bits! Ainsi, au lieu de la JNA essayait apparemment de copier la bibliothèque vers un emplacement temporaire et le charger, mais qui a échoué. Le « module spécifié est introuvable » message était pas très utile et me la mauvaise voie: - \

De toute façon de répondre à ma propre question ici est un exemple d'une dll qui peut être construit avec MSVC que Java (et la JNA) peuvent utiliser (il suffit de mettre dans le répertoire pour votre système!):

GimmeFiveDll.c:

#ifdef __cplusplus
#error no C++, to keep this example simple
#endif

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

DllTest.java:

import com.sun.jna.Native;

public class DllTest {

    static {
        Native.register("GimmeFiveDll");
    }

    public static native int gimmeFive();

    public static void main(String[] args) {
        System.out.println("I got: " + DllTest.gimmeFive());
    }
}

Si tout va bien Java imprimera. "Je suis arrivé: 5"

Notez que je ne trouve pas nécessaire de modifier les paramètres du compilateur d'utiliser stdcall ou de déclarer __stdcall dans la signature de la fonction. En fait, aucun changement de compilateur ont été nécessaires du projet dll normale vide l'assistant crée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top