제 3 자 .NET 어셈블리와 대규모 Java 응용 프로그램이 있습니다. Java 애플리케이션에서 .NET 클래스 라이브러리에 의해 제공되는 mothod를 호출해야한다. 어셈블리가 COM을 사용할 수 없습니다. 나는 인터넷을 검색하고 지금까지 나는 다음과 같습니다자바에서 .NET 어셈블리 호출 : JVM이 충돌 함
C# 코드 (cslib.cs) :
using System;
namespace CSLib
{
public class CSClass
{
public static void SayHi()
{
System.Console.WriteLine("Hi");
}
}
}
(3.5 NET을 사용하지만 같은 2.0를 사용하는 경우 발생) 컴파일 :
csc /target:library cslib.cs
C++ 코드 (clib.cpp) : (VC 2008 도구를 사용하여 컴파일
#include <jni.h>
#using <CSLib.dll>
using namespace CSLib;
extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
CSLib::CSClass::SayHi();
}
하지만 일 2003 도구를 사용하는 경우 동일한 전자)가 발생합니다
cl /clr /LD clib.cpp
mt -manifest clib.dll.manifest -outputresource:clib.dll;2
자바 코드 (CallCS.java) :
class CallCS {
static {
System.loadLibrary("clib");
}
private static native void callCS();
public static void main(String[] args) {
callCS();
}
}
나는 자바 클래스를 실행하려고하면, 자바 VM 충돌이 방법을 (호출하는 동안) 라이브러리를로드 할 수 있습니다 :
# # 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을 수정하면
또한, 모든 심지어 자바에서 잘 작동 :
#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");
}
마무리하려면
- 을 나는 자바에서 시스템 메소드를 호출 할 수 있어요 -> clib.dll -> mscorlib.dll에서 내가 CPPApp에서 모든 메소드를 호출 할 수 있어요
- -> clib.dll -> cslib.dll 나는 자바에서 어떤 메소드를 호출 할 수 없습니다입니다
- -> clib.dll - > cs lib.dll
위의 1.을 사용하는 해결 방법을 알고 있습니다 - 나는 assmebly를로드하고 원하는 메서드를 시스템 호출 만 사용하여 호출 할 수 있지만 코드가 지저분 해지고 더 나은 결과를 기대합니다. 해결책.
나는 반사 방식을 사용하는 dotnetfromjava 프로젝트에 대해 알고 있지만, 필요 이상으로 복잡성을 추가하지 않는 것을 선호합니다. 그러나 다른 방법이 없다면 이런 식으로 사용할 것입니다.
나는 또한 ikvm.net을 보았지만 나의 이해는 자신의 JVM (C#으로 작성)을 사용하여 마법을 수행한다는 것이다. 그러나 VM에서 전체 Java 응용 프로그램을 실행하는 것은 선택 사항이 아닙니다.
감사합니다.
는 C++ 코드는 실제로 바로 C++/CLI입니까? – Gili
예,/clr 옵션이 지정되었습니다. – Kcats