我有第三方.NET程序集和大型Java应用程序。我需要从Java应用程序调用.NET类库提供的方法。该程序集不支持COM。 我已经搜索的净,到目前为止我有以下:从Java调用.NET程序集:JVM崩溃
C#代码(cslib.cs):
using System;
namespace CSLib
{
public class CSClass
{
public static void SayHi()
{
System.Console.WriteLine("Hi");
}
}
}
与(使用.NET 3.5,但是当使用2.0同样的情况)编译:
csc /target:library cslib.cs
C++代码(clib.cpp):
#include <jni.h>
#using <CSLib.dll>
using namespace CSLib;
extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
CSLib::CSClass::SayHi();
}
与(使用VC 2008和工具编译,但是第当使用2003和工具电子同样的情况):
cl /clr /LD clib.cpp
mt -manifest clib.dll.manifest -outputresource:clib.dll;2
Java代码(CallCS.java):
class CallCS {
static {
System.loadLibrary("clib");
}
private static native void callCS();
public static void main(String[] args) {
callCS();
}
}
当我尝试运行Java类,Java虚拟机崩溃时调用的方法(它能够加载库):
# # An unexpected error has been detected by Java Runtime Environment: # # Internal Error (0xe0434f4d), pid=3144, tid=3484 # # Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86) # Problematic frame: # C [kernel32.dll+0x22366] # ... Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j CallCS.callCS()V+0 j CallCS.main([Ljava/lang/String;)V+0 v ~StubRoutines::call_stub
但是,如果我创建加载clib.dll并调用导出函数Java_CallCS_callCS普通CPP的应用程序,一切都OK了。 我已经在x86和x64环境中尝试了这一点,结果是一样的。我还没有尝试过其他版本的Java,但我需要在1.5.0上运行代码。
而且,如果我修改clib.cpp调用的系统方法,一切工作正常甚至从Java:
#include <jni.h>
#using <mscorlib.dll>
using namespace System;
extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
System::Console::WriteLine("It works");
}
为了结束:
- 我能够从Java调用系统方法 - > clib.dll - > mscorlib.dll
- 我可以从CPPApp调用任何方法 - > clib.dll - > cslib.dll
- 我无法从Java调用任何方法 - > clib.dll - > cs lib.dll
我知道一个解决方法,使用1.上面 - 我可以使用反射装载assmebly和调用所需的方法只使用系统调用,但代码变得凌乱,我希望更好解。
我知道dotnetfromjava项目,它使用了反射方法,但不希望增加比所需更多的复杂性。但是,如果没有其他方式,我会使用类似的东西。
我也看过ikvm.net,但我的理解是它使用它自己的JVM(用C#编写)来完成这个魔术。但是,在虚拟机下运行整个Java应用程序对我来说是不行的。
谢谢。
的C++代码实际上是C++/CLI吗? – Gili 2009-09-25 16:08:58
是的,/ clr选项指定 – Kcats 2009-10-05 08:47:38