मेरे पास एक तृतीय पक्ष .NET असेंबली और एक बड़ा जावा एप्लिकेशन है। मुझे जावा एप्लिकेशन से .NET क्लास लाइब्रेरी द्वारा प्रदान किए गए मोथोड्स को कॉल करने की आवश्यकता है। असेंबली COM-सक्षम नहीं है। मैं शुद्ध खोज की है और अब तक मैं निम्नलिखित है:जावा से .NET असेंबली को कॉल करना: JVM क्रैश
सी # कोड (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
सी ++ कोड (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();
}
(कुलपति 2008 उपकरण का उपयोग कर के साथ संकलित है, लेकिन वें ई एक ही होता है 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();
}
}
जब मैं जावा वर्ग चलाने का प्रयास, जावा वी एम दुर्घटनाओं विधि (लागू करते हुए यह पुस्तकालय लोड करने में सक्षम) है:
# # 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 कॉल बनाने के लिए, सब कुछ ठीक है। मैंने x86 और x64 वातावरण दोनों पर यह कोशिश की है और नतीजा वही है। मैंने जावा के अन्य संस्करणों की कोशिश नहीं की है, लेकिन मुझे कोड 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 - > सीएस lib.dll
मैं एक समाधान के ऊपर 1. का उपयोग करता है के बारे में पता कर रहा हूँ - मैं केवल सिस्टम कॉल का उपयोग कर assmebly लोड और वांछित विधियां प्रारंभ करने प्रतिबिंब का उपयोग कर सकते हैं, लेकिन कोड गंदा हो जाता है और मैं एक बेहतर करने के लिए आशा करता हूं उपाय।
मुझे डॉटनेटफॉम्वावा प्रोजेक्ट के बारे में पता है, जो प्रतिबिंब विधि का उपयोग करता है, लेकिन आवश्यकता से अधिक जटिलता नहीं जोड़ना पसंद करता है। हालांकि, अगर कोई दूसरा रास्ता नहीं है तो मैं इस तरह कुछ उपयोग करूंगा।
मैंने ikvm.net पर भी देखा है, लेकिन मेरी समझ यह है कि यह जादू करने के लिए अपने स्वयं के JVM (सी # में लिखा गया) का उपयोग करता है। हालांकि, पूरे जावा एप्लिकेशन को अपने वीएम के तहत चलाने के लिए मेरे लिए कोई विकल्प नहीं है।
धन्यवाद।
सी ++ कोड वास्तव में C++/CLI सही है? – Gili
हां,/clr विकल्प निर्दिष्ट किया गया है – Kcats