2011-06-23 21 views
0

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に渡してみました。残念ながら、それは何の違いもなく、私はまだ "スレッドシステムはまだ初期化されていません"エラーを取得します。

ターゲット機能を正常に呼び出せるようにスレッドシステムをどのように初期化できますか?

+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がロードされますが(OS独自の依存関係トラッキングに依存します)、の後にが設定されていない場合、

0

g_thread_initを呼び出す前にglibライブラリをロードしないでください。

NativeLibrary.getInstance("glib-2.0");コード行を削除すると、スレッドシステムが初期化され、LibSoda.INSTANCE.getFlavors()への呼び出しが成功しました!

なぜこれが効果的かわかりません。私はgthread-2.0ライブラリへのアクセスがGLibを暗黙的にロードすることを知っていますが、GLibを明示的にロードすると、最初にコールが無視される原因がわかりません。

上記の理由が説明されている回答には、どの回答が受け入れられるのかを喜んで変更します。

関連する問題