2012-05-04 4 views
0

J'essaye de générer une DLL que je peux accéder à partir de Java via JNA.UnsatisfiedLinkError - comment créer la DLL C++?

J'essaie juste un simple:

CPP:

void Initialize() 
{ 
    std::cout<< "Hello World!"; 
} 

iostream est également inclus et après la compilation je reçois: CreateDll.dll

Via Visual Studio, je peux générer maintenant un * .dll.

que je tente de charger en Java comme:

public class mainRoutine { 
    public static void main(String[] args) { 
    NativeWrapper INSTANCE = (NativeWrapper) Native.loadLibrary("CreateDll" , NativeWrapper.class);    
    INSTANCE.Initialize(); 
    } 

    static { 
    System.setProperty("jna.library.path", "C:\\workspace\\JNA"); 
    } 
} 

Il y a aussi une autre interface:

importation com.sun.jna.Library;

public interface NativeWrapper extends Library { 
    void Initialize(); 
} 

donc, mais maintenant en cours d'exécution de la fonction Java j'obtiens l'erreur,

java.lang.UnsatisfiedLinkError: 
    Error looking up function 'Initialize': 
    The specified procedure could not be found. 

Qu'est-ce que je manque? PS: Je sais qu'il y a beaucoup de sujets, mais en essayant depuis un jour, je n'ai pas encore trouvé la solution. Aidez-moi, s'il vous plaît.

+0

Je devine votre DLL n'exporte le symbole requis. – Nick

+0

Utilisez Dependency Walker (http://www.dependencywalker.com/) pour afficher les noms des fonctions exportées. – technomage

+0

Si vous compilez des choses quand même, [JavaCPP] (http://code.google.com/p/javacpp/) est probablement plus facile à utiliser que JNA ... –

Répondre

0

Vous devez l'exportation et (si vous utilisez C++) non décorer le nom de la fonction.

Sous Windows, les fonctions sont généralement disponibles pour l'exportation avec __declspec(dllexport).

Sur toute plate-forme, pour vous assurer qu'une fonction est exportée sous forme non gérée, vous devez utiliser extern "C".

Plus précisément:

extern "C" void __declspec(dllexport) Initialize() { ... } 

Il existe d'autres façons de désigner les fonctions exportées, mais cela est probablement le plus commun et facile à utiliser. Si vous n'utilisez pas, extern "C", votre fonction ressemblera à [email protected]@, où les caractères parasites supplémentaires sont utilisés par le compilateur et l'éditeur de liens pour rendre une fonction donnée reconnaissable uniquement en fonction de sa signature d'appel.

+0

Cela a résolu la question. Merci! –

0

Exportez-vous le symbole:

void _declspec(dllexport) Initialize() 
{ 
    std::cout<< "Hello World!"; 
} 
0

Que se passe-t-il si une classe doit être implémentée? où le fichier .h ressemble à ceci:

namespace simpleDLLNS 
{ 
    class simpleDLL 
    { 
    public: 

     char giveVoidPtrGetChar(void* param); 
     int giveIntGetInt(int a); 
     void simpleCall(void); 
     int giveVoidPtrGetInt(void* param); 
    }; 
} 

Où devrait extern __declspec vide "C" (dllexport) être utilisé? Je l'ai utilisé lors de l'implémentation des fonctions. mais quand je l'ai ouvert la dll, il ressemblait à ceci:

simpleCall @ simpleDLL @ simpleDLLNS @@ QAEXXZ