2015-10-21 98 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),因此可返回一个指针到你已经在,从而导致无限的递归功能,并且由于最终碰撞到堆叠疲惫。