我创建了一个启动线程的java库。
当使用普通的 java-main 方法测试此库并调用该库时,有问题的线程启动正常。
但是现在我想通过 JNI 从 C dll 调用这个库。
1)因此,C dll通过JNI调用foo
的库方法
2) foo
创建一个 Java 线程并在其上调用start
3) foo
返回到 C dll 调用方。
4) Java 线程现在启动
问题是我从线程中得到了一个Future
,我调用了get
。
当从 C dll 调用 java 代码时,此get
永久阻塞,但在从另一个 Java 应用程序调用时工作正常。
所有其他代码在 JNI 中也能正常运行。
知道这是怎么发生的吗?
dll 或 JNI 是否以某种方式阻止了 Java 线程的创建?
如果有人遇到类似的问题:
问题是我创建了对 dll 的本机回调。
此回调是从创建的线程调用的,不允许在本机代码上进行多线程处理。
删除从线程到本机代码的所有调用解决了这个问题。