Я пытаюсь создать библиотеку 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 выводит цикл «Загрузка символа …», а затем завершается без какого-либо сообщения. Я мог бы определить, что это связано с dlsym ().
С nm -D lib.so
Я мог бы заглянуть внутрь lib.so. Функция GetDllVersion () действительно является символом внутри этой библиотеки.
Может кто-нибудь сказать мне, почему существует бесконечный цикл и когда Java VM завершается?
С уважением, Вурми
Эта строка:
void* lib = dlopen("~/lib.dll",RTLD_NOW);
всегда потерпит неудачу, потому что dlopen
не делает тильду-расширение (вообще, только оболочка делает). Вы действительно должен проверить dlopen
возвращаемое значение
Эта строка:
GetDllVersion getVer= (GetDllVersion) dlsym(lib,"GetDllVersion");
эквивалентно dlsym(RTLD_DEFAULT, ...)
(так как RTLD_DEFAULT == 0
а также lib == NULL
) и в качестве такового возвращает указатель на функцию, в которой вы уже находитесь, что приводит к бесконечной рекурсии и возможному падению из-за исчерпания стека.
Других решений пока нет …