2016-04-07 99 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字節。