2016-04-07 3 views
1

ライブラリ用のswigでJNIラッパーを作成しました。 swig directorを使ってJVMにコールバックします。これらのコールバックの一部は、ネイティブライブラリ内で作成されたスレッドで発生します。非JVMスレッドの最初のコールバックはSIGSEGVで失敗し、AttachCurrentThreadの負の戻り値(-1)を無視して、実際にはnullのjenvポインタを逆参照することができます。これはswig生成コードで発生します。JNI:AttachCurrentThreadは-1を返します

ネイティブ側で作成したスレッドのディレクタークラスを介してJVMにコールバックしようとしました。これは正常に動作します。しかし、ラップされたライブラリによって作成されたスレッドからは機能しません。

AttachCurrentThreadが失敗する可能性のある原因は何ですか?

+0

このようなサウンドは、SWIGよりも一般的なJNI質問です。 http://stackoverflow.com/questions/12900695/how-to-obtain-jni-interface-pointer-jnienv-for-asynchronous-callsを参照してください。一方、あなたはおそらくこれを説明する最小、完全な例を作ることができますか?そうすれば、誰かにとってははるかに簡単な解決策を見つけ出すことができます。 – Flexo

答えて

1

スレッドに十分なスタック領域がない場合、AttachCurrentThreadは失敗します。残念ながら、Oracle JVMのドキュメントには、AttachCurrentThreadが動作するために必要な最小限のスタック領域は記載されていません。

私の場合、ネイティブライブラリは組み込みハードウェア用に最適化されているため、一般的にスタックサイズは100000バイトです。