当前位置: 首页 > 知识库问答 >
问题:

C#调用Java代码加载非托管dll

左丘繁
2023-03-14
public void Foo(){
    System.loadLibrary("absolute_path_to_my_dll.dll")
}

好吧,问题是:当我运行C#代码时,对System.LoadLibrary(...)的java调用失败,我得到一个“UnsatisfiedLinkError:Can't load absolute_path_to_my_dll.dll”。绝对路径是正常的,并且dll存在。

有人帮忙吗?提前道谢。

编辑%1

public void Foo(){
    System.loadLibrary("absolute_path_to_my_dll.dll")
}

现在,我在托管dll中编译java代码,该dll可以导入到.NET项目中。首先,我将java项目导出到一个jar文件“myjar.jar”。然后我应用Ikvmc.exe生成一个托管dll,假设是“MyNewDLL.dll”。

IKVM.exe-目标:库-输出:“MyNewDLL.dll”“MyJar.jar”

这一步工作得很好,我可以在VS项目中导入一个新的dll。

现在我创建了一个新的VS测试器解决方案。我添加了“MyNewDLL.dll”作为引用,以便在我的C#代码中使用它。此外,我还添加了ikvm.core.jdk引用(如果没有,则project无法编译),并将project配置为32位模式。问题从这里开始:

  • 运行此安装程序会给出“ikvm.runtime.jni错误”。我已添加了该引用。
  • 再次运行给出“Can't find IKVM-native”。由于我无法添加IKVM-native-win32-x86.dll或IKVM-native-win32-x64.dll作为引用,我将它们都放在输出路径(bin/debug)中。
  • 接下来尝试它会给出“UnsatisfiedLinkError:Can't load xxx.dll”。

如果dll在java step中加载得完美无缺,那怎么可能呢?

烦恼尝试

在开始哭泣之前,我尝试了一种方法:创建了一个只调用Foo()的java主程序。然后我用IKVMC.exe工具生成了一个可执行文件,并在windows控制台中调用它。它给了我同样的错误,UnsatisfiedLinkError,所以可能是IKVMC.exe问题,但我不明白为什么。

好消息.看来我已经解决了问题。首先,我不得不在ikvmc.exe调用中添加-platform:x86(步骤2)。生成的dll成功地导入到我的C#项目中,如果我们在执行模式下运行(而不是调试),它会很好地工作。如果我尝试在VS中调试,它会给我System.Runtime.InteropServices.SehException。

在本机代码(使用ikvm加载到C#中的java代码)下是否存在与调试本机代码(加载到java代码中的dll)有关的bug?

共有1个答案

单于智
2023-03-14

您的dll是32位的,而您是在64位的平台上运行的吗?

如果是,那么问题是IKVM是独立于平台的。这意味着在64位系统上运行64位进程

要解决这个问题,您需要一个64位版本的dll或将IKVM.exe标记为32位进程。

 类似资料:
  • 本文向大家介绍.NET中托管和非托管代码之间的区别,包括了.NET中托管和非托管代码之间的区别的使用技巧和注意事项,需要的朋友参考一下 .NET Framework具有CLR(公共语言运行时),可以执行用.NET语言编写的代码。CLR管理内存需求,安全性,代码优化,特定于平台的转换等。在非托管代码的情况下,不存在CLR,并且代码由操作系统直接执行。 以下是托管代码和非托管代码之间的一些重要区别。

  • 问题内容: 有没有人能将C#代码集成到Java应用程序中呢? 代码很小,所以我可以用Java重写,但是如果可能的话,我宁愿重用代码。不要重复自己,等等。 另外,我知道我可以将C#公开为Web服务或其他任何东西,但是其中包含一些安全性/加密功能,因此,我宁愿将其紧密集成。 编辑:它将在基于服务器的应用程序上,因此“下载”另一个运行时是无关紧要的。 问题答案: 有一个IL到Java字节码编译器Gras

  • gcc-g-i/usr/lib/jvm/java-1.6.0-openJDK-1.6.0.0.x86_64/include/-i/usr/lib/jvm/java-1.6.0-openJDK-1.6.0.0.x86_64/include/-i/usr/lib/jvm/java-1.6.0-openJDK-1.6.0.0.x86_64/include/-i/usr/lib/jvm/java-1.6.

  • 本文向大家介绍详解C# 托管资源和非托管资源,包括了详解C# 托管资源和非托管资源的使用技巧和注意事项,需要的朋友参考一下 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网

  • 本文向大家介绍C# 在项目中引用x86 x64的非托管代码的方法,包括了C# 在项目中引用x86 x64的非托管代码的方法的使用技巧和注意事项,需要的朋友参考一下 因为现在的项目使用的是 AnyCpu 在 x86 的设备使用的是x86,在x64使用的是x64,但是对于非托管代码,必须要在x64使用x64的dll,在x86使用x86的dll。在C++没有和C#一样的 AnyCpu 所以需要在项目运行

  • 当你想要分享你代码给其他人,或者是你需要在另外一台电脑上工作时,托管代码就会是一个非常重要的话题。基本上代码托管有两种不同的形式: do-it-yourself(建立一个自己的)或者 leave-me-in-peace(使用第三方提供的平台,不麻烦自己)。 (A) Do-It-Yourself 把你的 Git 仓库托管在你自己的服务器上会有很多的优点: 可以节省你花在代码托管服务上的费用。 你的代