0

我正在尝试构建一个 Linux 库 (*.so) 以在 Java 应用程序中使用它。这个库本身加载一个带有本机函数的 dll 文件。

这是我的 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 应用程序在循环中打印出“Loading Symbol...”,然后在没有任何消息的情况下终止。我可以确定这与 dlsym() 有关。

nm -D lib.so我可以查看 lib.so 内部。函数 GetDllVersion() 确实是这个库中的一个符号。

有人能告诉我为什么会有一个无限循环并且 Java VM 正在终止吗?

问候乌尔米

4

1 回答 1

0

这一行:

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

总是会失败,因为dlopen不做波浪号扩展(通常,只有shell 做)。你真的应该检查dlopen返回值。

这一行:

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

等价于dlsym(RTLD_DEFAULT, ...)(because RTLD_DEFAULT == 0and lib == NULL) 并因此返回一个指向您已经在其中的函数的指针,从而导致无限递归,并最终由于堆栈耗尽而崩溃。

于 2015-10-26T03:30:48.120 回答