我正在处理一些加载非托管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位模式配置项目。问题从这里开始:
如果在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)相关的错误?
答案 0 :(得分:0)
你的dll是32位,你是在64位平台上运行的吗?
如果是,则问题是IKVM与平台无关。这意味着在64位系统上它运行64位进程。
要解决此问题,您需要64位版本的dll或将ikvm.exe标记为32位进程。