【问题标题】:How can I call the GLib threads g_thread_init using JNA?如何使用 JNA 调用 GLib 线程 g_thread_init?
【发布时间】: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 版)。

标签: java jna glib


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    我很乐意将接受哪个答案更改为解释上述原因的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多