我为库创建了一个带有Swig的JNI包装器。我使用Swig Director回调回JVM。其中一些回调发生在本机库中创建的线程上。非JVM线程上的第一个回调以SIGSEGV失败,我可以追溯到忽略AttachCurrentThread的负返回值(-1),从而取消引用实际上为null的jenv指针。这在Swig生成的代码中发生。

我尝试从我在本机端创建的线程中通过Director类回调回JVM。这很好。但是,它不适用于我包装的库创建的线程。

AttachCurrentThread失败的可能原因可能是什么?

最佳答案

当线程没有足够的堆栈空间时,AttachCurrentThread将失败。不幸的是,Oracle JVM的文档没有提及使AttachCurrentThread正常工作所需的最小堆栈空间。

在我的情况下,本机库针对嵌入式硬件进行了优化,因此创建的线程通常堆栈大小为100000字节。

07-27 21:35