Как я могу вызвать потоки GLib g_thread_init, используя JNA? - PullRequest
0 голосов
/ 23 июня 2011

Я пытаюсь вызвать функцию в нативной библиотеке 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. К сожалению, это не имело никакого значения, и я все еще получаю ошибку «система потоков еще не инициализирована».

Как я могу инициализировать систему потоков, чтобы я мог успешно вызвать целевую функцию?

Ответы [ 2 ]

0 голосов
/ 01 июля 2011

Не загружайте библиотеку glib перед вызовом g_thread_init.

NativeLibrary.getInstance ("glib-2.0") явно загружает glib.Хотя вызов g_thread_init в конечном итоге неявно загружает glib (в зависимости от собственного отслеживания зависимостей ОС), он, вероятно, делает это после установки любых частей gthread, которые вызывают ошибку, если не настроен.1007 *

0 голосов
/ 24 июня 2011

Не загружайте библиотеку glib перед вызовом g_thread_init.

Когда я удалил строку кода NativeLibrary.getInstance("glib-2.0");, система потоков инициализировалась и вызов LibSoda.INSTANCE.getFlavors() завершился успешно!

Я не совсем уверен, почему это сработало.Я знаю, что доступ к библиотеке gthread-2.0 неявно загрузит GLib, но я не знаю, почему загрузка GLib явно вызывает игнорирование вызова g_thread_init.

Я с радостью заменю принятый ответ на ответ, который объясняет, почему вышесказанное сработало.

...