GLibとGLibスレッドを使用するJNAを使用してネイティブCライブラリで関数を呼び出そうとしています。私は、関数を呼び出すようにしようとすると、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
機能がgthreadヘッダで定義されている方法は次のとおりです。
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)がないようです。 –