Java 应用程序在从 C (JNI) DLL 调用时不会启动线程



我创建了一个启动线程的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 的本机回调。

此回调是从创建的线程调用的,不允许在本机代码上进行多线程处理。

删除从线程到本机代码的所有调用解决了这个问题。

最新更新