Я пытаюсь вызвать функцию в нативной библиотеке C, используя JNA, которая использует потоки GLib и GLib. Когда я пытаюсь вызвать функцию, JVM падает, и выводится следующая ошибка:
GLib-ERROR **: The thread system is not yet initialized.
aborting...
Я почти уверен, что это означает, что код должен вызывать функцию g_thread_init
в библиотеке gthread
перед вызовом целевой функции. Таким образом, я определил следующий интерфейс для загрузки библиотеки gthread
...
public interface GLibThreads extends Library {
public static final GLibThreads INSTANCE =
(GLibThreads) Native.loadLibrary("gthread-2.0", GLibThreads.class);
public void g_thread_init(Pointer pointer);
}
... и я попытался вызвать его перед целевой функцией ...
NativeLibrary.getInstance("glib-2.0");
GLibThreads.INSTANCE.g_thread_init(Pointer.NULL);
String flavors = LibSoda.INSTANCE.getFlavors();
... но, к сожалению, это не работает. Я по-прежнему получаю сообщение об ошибке «Система потоков еще не инициализирована».
Я думал, что моя проблема могла быть связана с определением метода для принятия JNA Pointer
. Вот как определяется функция g_thread_init
в заголовке gthread:
void g_thread_init (GThreadFunctions *vtable);
Итак, я попытался определить структуру GThreadFunctions
и передать null
. К сожалению, это не имело никакого значения, и я все еще получаю ошибку «система потоков еще не инициализирована».
Как я могу инициализировать систему потоков, чтобы я мог успешно вызвать целевую функцию?