java — dlsym заканчивается бесконечным циклом

Я пытаюсь создать библиотеку 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 завершается?

С уважением, Вурми

0

Решение

Эта строка:

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

всегда потерпит неудачу, потому что dlopen не делает тильду-расширение (вообще, только оболочка делает). Вы действительно должен проверить dlopen возвращаемое значение

Эта строка:

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

эквивалентно dlsym(RTLD_DEFAULT, ...) (так как RTLD_DEFAULT == 0 а также lib == NULL) и в качестве такового возвращает указатель на функцию, в которой вы уже находитесь, что приводит к бесконечной рекурсии и возможному падению из-за исчерпания стека.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector