我正在尝试构建一个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应用程序打印出#34;正在加载符号......&#34;在循环中,然后没有任何消息。我可以确定这必须与dlsym()做一些事情。
使用nm -D lib.so
我可以查看lib.so.函数GetDllVersion()确实是这个库中的一个符号。
有人可以告诉我为什么存在无限循环并且Java VM正在终止?
问候Wurmi
答案 0 :(得分:0)
这一行:
void* lib = dlopen("~/lib.dll",RTLD_NOW);
总是会失败,因为dlopen
不会进行波浪扩展(通常,只有 shell会这样做)。您确实应该检查dlopen
返回值。
这一行:
GetDllVersion getVer= (GetDllVersion) dlsym(lib,"GetDllVersion");
等同于dlsym(RTLD_DEFAULT, ...)
(因为RTLD_DEFAULT == 0
和lib == NULL
),因此会返回指向您已经处于的函数的指针,从而导致无限递归,并最终导致崩溃堆栈疲惫。