我想在本地C库中使用使用GLib和GLib线程的JNA调用一个函数。当我试图调用功能,JVM崩溃并打印以下错误:如何使用JNA调用GLib线程g_thread_init?
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
的方法有关。这里的g_thread_init
功能是如何在g线程头文件中定义:
void g_thread_init (GThreadFunctions *vtable);
所以,我试图定义GThreadFunctions
结构和传递null
。不幸的是,这没有任何区别,我仍然得到“线程系统尚未初始化”的错误。
如何初始化线程系统,以便我可以成功调用目标函数?
g_thread_supported()和g_thread_get_initialized()返回什么? – Abhijith
g_threads_supported()不能从JNA调用,因为它是宏而不是函数。我会给g_thread_get_initialized()一个尝试并让你知道。 –
不幸的是,它看起来像我必须使用的GLib线程版本没有g_thread_get_initialized()函数(版本2.0)。 –