如何使用JNA调用GLib线程g_thread_init?

时间:2011-06-23 12:38:58

标签: java jna glib

我正在尝试使用使用GLib和GLib线程的JNA在本机C库中调用函数。当我尝试调用该函数时,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的方法有关。以下是在gthread标头中定义g_thread_init函数的方法:

void    g_thread_init   (GThreadFunctions       *vtable);

所以我尝试定义GThreadFunctions结构并传入null。不幸的是,这没有任何区别,我仍然得到“线程系统尚未初始化”错误。

如何初始化线程系统以便我可以成功调用目标函数?

2 个答案:

答案 0 :(得分:0)

在调用g_thread_init之前不要加载glib库。

当我删除NativeLibrary.getInstance("glib-2.0");代码行时,线程系统已初始化并且对LibSoda.INSTANCE.getFlavors()的调用成功了!

我不完全确定为什么会这样。我知道访问gthread-2.0库会隐式加载GLib,但我不知道为什么首先显式加载GLib会导致g_thread_init调用被忽略。

我很乐意改变哪个答案被接受,这个答案解释了上述原因。

答案 1 :(得分:0)

在调用g_thread_init之前不要加载glib库。

NativeLibrary.getInstance(“glib-2.0”)显式加载glib。虽然调用g_thread_init最终会隐式加载glib(取决于操作系统自己的依赖关系跟踪),但在设置了设置后触发错误的gthread的任何部分后,它可能会这样做