2015-10-21 97 views
0

我想構建一個Linux庫(*。so)以在Java應用程序中使用它。這個庫自身加載一個帶有本地函數的dll文件。dlsym在無限循環中結束

這是我的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); 

}

的代碼與wineg++ -shared lib.cpp -o libexports.so -Wl,--no-as-needed -ldl編譯沒有錯誤。

Java應用程序在一個循環中打印出「正在載入符號...」,然後在沒有任何消息的情況下終止。我可以確定這必須用dlsym()做些什麼。

nm -D lib.so我可以看看裏面的lib.so.函數GetDllVersion()的確是這個庫中的一個符號。

有人可以告訴我爲什麼有一個無限循環,並且Java VM正在終止?

問候Wurmi

回答

0

這條線:

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

總是會失敗,因爲dlopen沒有做波浪膨脹(一般只有殼一樣)。你真的應該檢查dlopen返回值。

這條線:

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

相當於dlsym(RTLD_DEFAULT, ...)(因爲RTLD_DEFAULT == 0lib == NULL),因此可返回一個指針到你已經在,從而導致無限的遞歸功能,並且由於最終碰撞到堆疊疲憊。