我正在尝试使用使用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
。不幸的是,这没有任何区别,我仍然得到“线程系统尚未初始化”错误。
如何初始化线程系统以便我可以成功调用目标函数?
答案 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的任何部分后,它可能会这样做