2011-06-23 23 views
0

我想在本地C库中使用使用GLib和GLib线程的JNA调用一个函数。当我试图调用功能,JVM崩溃并打印以下错误:如何使用JNA调用GLib线程g_thread_init?

GLib-ERROR **: The thread system is not yet initialized. 
aborting... 

我敢肯定,这意味着代码需要调用目标函数之前调用的gthreadg_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的方法有关。这里的g_thread_init功能是如何在g线程头文件中定义:

void g_thread_init (GThreadFunctions  *vtable); 

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

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

+0

g_thread_supported()和g_thread_get_initialized()返回什么? – Abhijith

+0

g_threads_supported()不能从JNA调用,因为它是宏而不是函数。我会给g_thread_get_initialized()一个尝试并让你知道。 –

+0

不幸的是,它看起来像我必须使用的GLib线程版本没有g_thread_get_initialized()函数(版本2.0)。 –

回答

0

请勿在调用g_thread_init之前加载glib库。

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

0

请勿在调用g_thread_init之前加载glib库。

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

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

我很乐意将答案接受的答案解释为什么上述工作。