【发布时间】:2011-07-06 02:54:41
【问题描述】:
我正在尝试使用 JNA 调用本机 C 库中的函数,该 JNA 使用 GLib 和 GLib 线程。当我尝试调用该函数时,JVM 崩溃并打印以下错误:
GLib-ERROR **: The thread system is not yet initialized.
aborting...
我很确定这意味着代码需要在调用目标函数之前调用gthread 库中的g_thread_init 函数。于是,我定义了如下接口来加载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。不幸的是,这没有任何区别,我仍然收到“线程系统尚未初始化”错误。
如何初始化线程系统以便成功调用目标函数?
【问题讨论】:
-
g_thread_supported() 和 g_thread_get_initialized() 返回什么?
-
g_threads_supported() 不能从 JNA 调用,因为它是宏而不是函数。我会试试 g_thread_get_initialized() 并告诉你。
-
不幸的是,我必须使用的 GLib Threads 版本似乎没有 g_thread_get_initialized() 函数(2.0 版)。