Java JNI и Vala — неопределенный символ: g_once_init_enter

Я написал крошечный класс Vala, скомпилировал его в код C, сгенерировал заголовок JNI и реализацию для вызова Vala/CCode.

Итак, в конце у меня есть два заголовка и два файла реализации, которые я компилирую с помощью gcc в библиотеку JNI. он отлично компилируется и приводит к библиотеке.

Когда я запускаю приложение Java, включая эту библиотеку, я получаю symbol lookup error в библиотеке.

Самое интересное: undefined symbol: g_once_init_enter - это не в моем коде, а в бойком коде, сгенерированном valac.

Таким образом, код JNI C вызывает код Vala C, который вызывает вещи glib. Java, кажется, не находит бойкую часть.

Кто-нибудь знает, что здесь делать?


person Das Jott    schedule 04.03.2014    source источник
comment
вы статически связываете библиотеку glib с вашей общей библиотекой? Если нет, вам также нужно будет загрузить библиотеку glib.   -  person Samhain    schedule 04.03.2014
comment
@Samhain: Да, я тоже так думал... так и сделал: ` static { System.loadLibrary(glib-2.0); } статический { System.loadLibrary(test); } ` и все равно получаю: ` /usr/lib/jvm/java-7-openjdk-amd64/bin/java: ошибка поиска символа: /usr/lib/x86_64-linux-gnu/libtest.so: неопределенный символ: g_once_init_enter ` Обе библиотеки находятся в указанном каталоге, поэтому он не должен быть неопределенным...   -  person Das Jott    schedule 05.03.2014
comment
Это динамическое связывание.   -  person Das Jott    schedule 05.03.2014
comment
Теперь это работает. github.com/DasJott/mkjni   -  person Das Jott    schedule 28.03.2014
comment
@DasJott Вы должны добавить ответ к своему решению, чтобы помочь будущим посетителям этого вопроса.   -  person Jens Mühlenhoff    schedule 24.09.2016


Ответы (1)


Похоже, это была проблема с кодом Das Jott для генерации командных строк компилятора для создания файлов C, и она была исправлена ​​в этом коммите. Похоже, они пытались выполнить сценарий оболочки в стиле bash, используя exec(), что привело к тому, что флаги pkg-config для glib-2.0 так и не попали в командную строку компоновщика.

tl;dr: Как сказал Самайн, основная проблема заключалась в том, что не удалось установить связь с glib-2.0.

person Philip Withnall    schedule 22.11.2018
comment
Спасибо! Я больше не занимался этой темой :( - person Das Jott; 15.05.2019