1

我有一个使用 JNI 连接到后台 C 库的 Java 应用程序(tomcat-app)。这个 java 应用程序以一种非常随机的方式崩溃。我在系统事件中看到,这是基于 ntdll.dll 崩溃的,它是 Windows/System32 中的系统库。

有人可以告诉我,ntdll.dll 提供了哪些功能,它的用途是什么以及为什么 java 需要这个 ntdll.dll?

我使用 Google 来寻找解决方案,但是这种崩溃几乎可能发生在所有 Windows 系统上,我结合了很多应用程序(似乎它不仅仅是一个 windows-java 问题)。标准解决方案是重新安装/更新系统和/或应用程序。但是有没有解释,为什么这个 ntdll.dll 会造成这么大的麻烦?

你认为,如果我将更高版本的 ntdll.dll 放到 java 目录或 c-library 的目录中,这会有所帮助吗,这样 java 或 c-lib 可以采用这个较新的版本,而不是 Windows /System32 版本?

非常感谢您的建议。

4

2 回答 2

2

ntdll 是一个低级的 windows 系统 api,它提供了数百个 windows api 功能,如内存管理、加载 DLL 和系统异常。

您不能使用与您系统上的版本不同的版本,因为它是您正在运行的 Windows 操作系统版本的紧密耦合/不可或缺的一部分。

如果没有更多信息,很难判断问题可能是什么,但也许您在 JNI 包装器中使用了不正确的调用约定,这会导致堆栈不平衡。

于 2018-06-13T18:03:10.613 回答
0

看起来,JNI 调用是正确的(我们使用了一个外部库,它使用了 JNI)。此外,我们还找到了解决此问题的方法。Windows 的功能更新提高了 ntdll.dll 的版本。这解决了问题;java.exe的崩溃再也没有出现过。

于 2019-10-03T15:54:18.637 回答