Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI调用.NETDLL_Java_C#_.net_Dll_Java Native Interface - Fatal编程技术网

Java JNI调用.NETDLL

Java JNI调用.NETDLL,java,c#,.net,dll,java-native-interface,Java,C#,.net,Dll,Java Native Interface,我试图创建一个java应用程序,它将通过中间VisualC++的DLL调用C.*DLL,当我试图从CMD提示符或Eclipse IDE运行.class文件时,它都是好的,但是问题是,为了做到这一点,我需要将C*yDLL放置在与Java.EXE相同的目录中,否则会发生本地调用的异常,因此,不可能构建Java项目,任何关于如何实现这一点的想法都可以使用COM Interop启用并注册托管(.NET)dll。 请参阅此链接:没有COM,还有其他方法。如果无法更改.NET组件以支持COM客户端,您可能会

我试图创建一个java应用程序,它将通过中间VisualC++的DLL调用C.*DLL,当我试图从CMD提示符或Eclipse IDE运行.class文件时,它都是好的,但是问题是,为了做到这一点,我需要将C*yDLL放置在与Java.EXE相同的目录中,否则会发生本地调用的异常,因此,不可能构建Java项目,任何关于如何实现这一点的想法都可以使用COM Interop启用并注册托管(.NET)dll。
请参阅此链接:

没有COM,还有其他方法。如果无法更改.NET组件以支持COM客户端,您可能会发现一个更可取的组件,或者需要一个

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

这导致了一些选择:

  • 将总成安装到GAC中。(在最终用户机器上应该使用安装程序,但在开发人员机器上,可以使用
    gacutil
  • 将程序集放在
    java.exe
    文件夹中。或者,反过来,将Java的副本放在应用程序文件夹中
  • 创建具有程序集写入权限的子文件夹。创建或更新
    java.exe.config
    并将子文件夹列为探测路径 <>使用java调用API在C或C++中创建自己的代码> java > exe e/c>。它与JNI一起记录。你可以随意命名,因为这毕竟是你的申请。(这是许多基于Java的应用程序所做的,即使它们不使用.NET。例如eclipse和LibreOffice。)给出了一个完整的C语言示例。对于典型的MSVC构建,
    jni.h
    需要位于项目的include路径上,
    jvm.lib
    需要位于项目的库路径上,而
    jvm.dll
    需要位于Win32 dll搜索路径中
  • 其他备选方案:

  • VC DLL可以在需要程序集之前从路径显式加载程序集。看
  • 在标准搜索未找到程序集后,按需加载该程序集。请参阅(但请注意,它的描述是错误的:在自定义冲突解决程序出现故障之前以及如果出现故障,则不会发生故障)

  • 请澄清:您所说的与Java.exe“”位于同一目录中的“
    ”到底是什么意思?您的意思是需要将C#dll放在java.exe和javac.exe所在的javabin目录中吗?如果是,,确实很奇怪。是的,它似乎只在C#dll与java.exe和javac.exe位于同一目录下时才起作用,否则它会由于找不到dll而导致一些致命错误。在调用代码时,您是否提供了一个合适的类路径?是的……找到我直接调用的vc++dll没有问题,但即使C#dll位于与类相同的目录以及vc++dll仍然抛出了一个异常来解释第四点…看起来真的很有趣…我肯定想尝试一下