2015-10-21 11 views
0

J'essaye de construire une bibliothèque Linux (*. So) pour l'utiliser dans une application Java. Cette bibliothèque charge elle-même un fichier dll avec des fonctions natives.dlsym se termine en boucle infinie

Ceci est mon code C++:

__delspec(dllexport) void __cdecl GetDllVersion(void){ 
    typedef int(*GetDllVersion)(int*,int*,int*,int*); 

    void* lib = dlopen("~/lib.dll",RTLD_NOW); 
    cout << "Loading Symbol..." << endl; 
    GetDllVersion getVer= (GetDllVersion) dlsym(lib,"GetDllVersion"); 

    dlclose(lib); 

}

Le code a été compilé avec wineg++ -shared lib.cpp -o libexports.so -Wl,--no-as-needed -ldl sans erreurs.

L'application Java imprime "Loading Symbol ..." dans une boucle, puis se terine sans aucun message. Je pourrais déterminer que cela doit faire quelque chose avec dlsym().

Avec nm -D lib.so Je pourrais regarder à l'intérieur de la lib.so. La fonction GetDllVersion() est en effet un symbole dans cette bibliothèque. Est-ce que quelqu'un peut me dire pourquoi il y a une boucle infinie et où la machine virtuelle Java se termine?

Cordialement Wurmi

Répondre

0

Cette ligne:

void* lib = dlopen("~/lib.dll",RTLD_NOW); 

aura toujours l'échec, parce que dlopen ne le fait pas-tilde (en général, seule coquille fait). Vous vraiment devrait vérifier dlopen valeur de retour.

Cette ligne:

GetDllVersion getVer= (GetDllVersion) dlsym(lib,"GetDllVersion"); 

est équivalent à dlsym(RTLD_DEFAULT, ...) (parce que RTLD_DEFAULT == 0 et lib == NULL) et que ces déclarations vous un pointeur vers la fonction que vous êtes déjà, ce qui récursion infinie et accident éventuel raison d'une pile épuisement.