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

时间:2014-06-26 17:00:21

标签: java c# dll ikvm

我正在处理一些加载非托管dll的java代码,如下所示:

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

从eclipse或控制台可以正常工作。

下一步:我使用IKVM工具从我的java应用程序(ikvmc.exe)获取托管dll。一切正常,我的dll完美构建。事实上,我已经在测试解决方案中导入了该库(并且我已经添加了所需的所有IKVM参考资料-IKVM.Core.JDK,IKVM.Runtime.JNI等)。

嗯,这就是问题所在:当我运行C#代码时,对System.loadLibrary(...)的java调用失败,我得到一个" UnsatisfiedLinkError:无法加载absolute_path_to_my_dll.dll& #34; 即可。绝对路径没问题,dll就在那里。

有任何帮助吗?提前谢谢。

修改1

我会尝试详细解释:

Java步骤

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

如果路径不正确,此调用会提供上面提到的" UnsatisfiedLinkError" 。事实并非如此,一切顺利。 dll文件是32位的,所以我用jre7 x86编译了这个java项目(64位模式loadLibrary调用falis,显然,我们不能在64位AMD机器上加载32位dll。)

Ikvm step

现在我在托管dll中编译java代码,可以在.net项目中导入。首先,我将我的java项目导出到一个jar文件," myJar.jar"。然后我应用ikvmc.exe来生成托管dll,让我们说" myNewDll.dll"。

ikvm.exe -target:library -out:" myNewDll.dll" " myJar.jar"

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

C#步骤

现在我创建一个新的VS测试解决方案。我添加" myNewDll.dll"作为参考,我可以在我的C#代码中使用它。另外,我添加了IKVM.Core.JDK引用(如果没有,项目无法编译)并以32位模式配置项目。问题从这里开始:

  • 运行此设置会给出" IKVM.Runtime.JNI错误"。我已经添加了参考资料。
  • 再次运行会发现"无法找到ikvm-native"。由于我无法添加ikvm-native-win32-x86.dll或ikvm-native-win32-x64.dll作为参考,因此我将它们都放在输出路径中(bin / Debug)。
  • 接下来尝试它会给出" UnsatisfiedLinkError:无法加载xxx.dll"。

如果在java步骤中完美地加载dll,该怎么可能?

Annother尝试

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

有什么想法吗?

修改2

好消息。我似乎已经解决了这个问题。首先,我必须将-platform:x86添加到ikvmc.exe调用(步骤2)。生成的dll在我的C#项目中成功导入,如果我们在执行模式下运行(非调试),它可以正常工作。如果我尝试在VS中调试,它会给我System.Runtime.InteropServices.SEHException。

是否有任何与本机代码(使用ikvm在C#中加载的java代码)调试本机代码(在java代码中加载的DLL)相关的错误?

1 个答案:

答案 0 :(得分:0)

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

如果是,则问题是IKVM与平台无关。这意味着在64位系统上它运行64位进程。

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