Java JNA -> C++ -> .NET 库必须在 System32 中

标签 java c++ c windows

我让 Java 通过 JNA 调用 C++/CLR 库。当附加到 C# DLL(使用#using)时,​​C# DLL 必须在 System32 中,没有其他任何东西可以做,否则 JVM 崩溃(原因很明显)。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (os_windows_x86.cpp:149), pid=9932, tid=7464
#  guarantee(result == EXCEPTION_CONTINUE_EXECUTION) failed: Unexpected result from topLevelExceptionFilter
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode windows-amd64 compressed oops)
# An error report file with more information is saved as:
# (log dir)
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

听起来像是路径问题,对吧?那么这就是它变得有趣的地方:

这个有效:

C:> set PATH=C:\Program Files\Java\jre6\bin;C:\workspace\bin\plugins\64;c:\Windows\System32

这不是:

C:> set PATH=C:\Program Files\Java\jre6\bin;C:\workspace\bin\plugins\64

是的,库位于 c:\workspace\bin\plugins\64

请注意,如果 system32 包含在路径中,它会找到我的库,因此它会正确地挖掘 PATH 目录(或看起来如此),但是如果我将它直接放在我的 DLL 在我的工作区中的位置,它就无法运行它。我怀疑这是因为它是一个 .NET DLL(将它注册到 GAC 并不能修复它,但如果它修复了我也不能),我觉得这只是一个普通的库查找问题。

我是否遗漏了 Java 可能对我的库搜索路径所做的某些事情?我不能保证我有能力写入 System32(更不用说我需要做一些自动化的事情并且想远离操作系统目录)。

编辑 1:

如果我的 C# DLL 不在 c:\Windows\System32 中,而是在 C:\workspace\bin\plugins\64 中,这将无法工作,所以根据我愚蠢的假设,我可以将 System32 排除在外。

C:> set PATH=C:\Program Files\Java\jre6\bin;C:\workspace\bin\plugins\64;c:\Windows\System32

将 DLL 移回 c:\windows\system32 使其可以工作。

编辑2:

如果它有任何区别,它不会运行 根本 如果它是从 Eclipse 而不是命令行运行...从 Eclipse 运行的 System.getenv("PATH") 显示我的完整路径,从 C++/CLR DLL 中删除 C# DLL 允许它运行。

所以它完全是.NET DLL,从命令行运行Java .NET DLL必须在System32中,并且根本不会在Eclipse中运行。

如果您从 C++/CLR DLL 中删除 .NET DLL,它可以随时随地运行。

编辑 3:

在 GAC 注册时似乎工作正常(是时候感到难过,我发誓它以前没有工作),并且与此问题相关:

Calling .NET assembly from Java: JVM crashes

现在看看我是否可以让 AssemblyResolve 在 C++/CLR 上工作,这非常困难,因为它是一个库。

最佳答案

您的 .Net 库显然具有依赖性。我当然期望的一个依赖项是 mscoree.dll,它位于 System32 中。我还会仔细检查您的 DLL 或其任何依赖项中是否存在 CPU 限制(参见“64 位服务器”)。

关于Java JNA -> C++ -> .NET 库必须在 System32 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874713/

相关文章:

java - 在测试环境中禁用 mongoEmbeddedServer

java - ArrayList 和 Stream 的问题...我必须使用在另一个 ArrayList 中具有属性的元素来流式传输 ArrayList

java - 如何通过连接集合限制结果集

c++ - C++ 中的 DirectX 10 HUD

c++ - 将队列处理为包含文件的文件夹。可能出现的问题?

java - 是否有可以独立使用的类似 Tomcat 的类加载器?

c++ - WinApi任务查杀

C - 如何找到之前由 tmpfile() 创建的临时文件?

c - 如何让 Makefile 将 obj 文件放在单独的目录中?

c - 从不兼容的指针类型、头文件中的结构体进行赋值