java - JNI 调用.NET dll

标签 java c# .net dll java-native-interface

我正在尝试创建一个 Java 应用程序,它将通过中间的 Visula C++ dll 调用 C# dll,当我尝试从 cmd 提示符或 Eclipse IDE 运行 .class 文件时,一切都很好,但问题是为了这样做我需要将 C# dll 放在与 Java.exe 相同的目录中,否则 native 调用会发生异常,因此无法构建 Java 项目,关于如何完成的任何想法

最佳答案

还有其他方法,无需 COM。如果您不能更改 .NET 组件以支持 COM 客户端,您可能会找到一个更好的或需要一个。

当加载 CLR 的进程时,程序集搜索路径由进程的主 Win32 模块的位置确定。程序集搜索路径不同于 Win32 DLL 搜索路径。在本例中,它从 java.exe 的位置开始。因此,搜索路径包括全局程序集缓存 (GAC)、java.exe 的文件夹以及在 java.exe.config 中作为程序集探测路径列出的子文件夹(如果存在)。

参见 How the Runtime Locates Assemblies .

这导致了几个选项:

  1. 在 GAC 中安装程序集。 (在最终用户机器上应该使用安装程序,但在开发人员机器上,您可以使用 gacutil。)
  2. 将程序集放在java.exe 文件夹中。或者,相反,将 Java 的副本放在您的应用程序文件夹中。
  3. 为程序集创建一个具有写入权限的子文件夹。创建或更新 java.exe.config 并将子文件夹列为探测路径。
  4. 使用 Java 调用 API 在 C 或 C++ 中创建您自己的 java.exe。它与 JNI 一起记录在案。您可以随意命名,因为毕竟这是您的应用程序。 (这是许多基于 Java 的应用程序所做的,即使它们不使用 .NET。例如,eclipse 和 LibreOffice。)documentation在 C 中给出了一个完整的示例。对于典型的 MSVC 构建,jni.h 需要位于项目的包含路径中,jvm.lib 需要位于项目的库路径中,并且 jvm.dll 需要在 Win32 DLL 搜索路径中。

其他选择:

  1. VC DLL 可以在需要程序集之前从路径显式加载程序集。参见 Assembly::LoadFile .
  2. 在标准搜索找不到程序集后按需加载程序集。参见 AppDomain::AssemblyResolve Event (但请注意,它的描述是错误的:只有当您的自定义解析器失败时才会发生失败)。

关于java - JNI 调用.NET dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24344034/

相关文章:

c# - 如何获取枚举的基础值

java - 如何为不同的构建风格打包不同的 *.so 文件?

c# - 如何在 WPF 窗口关闭后调用方法?

c# - 可移植类库中的 MvvmLight - 如何进行单元测试

c# - 通过 REST API C# 打印装箱单 "No Address Provided"

c# - 将 UTF-8 字符串放入字符串类型的变量中

java - Vaadin 上传教程中出现 "Can not resolve symbol"错误

Java : generating power set with subset length between 3 and a max

java - 如何使用 javaagent 访问工具方法的变量?

c# - 如何实现PRI线路的调用控制系统