2009-01-20 17 views
18

मेरे पास एक जावा एप्लिकेशन है जिसे मुझे कुछ जानकारी सी ++ प्रोग्राम में पास करने की आवश्यकता है। यह सुझाव दिया गया है कि मैं ऐसा करने के लिए कुछ सरल सॉकेट प्रोग्रामिंग का उपयोग करता हूं। क्या यह सबसे अच्छा तरीका है? यदि विकल्प नहीं हैं तो क्या? यदि हां, तो मुझे सॉकेट प्रोग्रामिंग के बारे में सीखने के बारे में कैसे जाना चाहिए?जावा से सी ++ तक जानकारी पास करने का सबसे अच्छा तरीका क्या है?

उत्तर

16

आप कुछ ही विकल्प हैं:

  • सेल्सियस के लिए जावा से एक फ़ाइल दर्रा ++। यह शायद सबसे सरल है। परीक्षण करना आसान है और किसी भी तीसरे पक्ष के पुस्तकालयों को किसी भी अंत में आवश्यकता नहीं है।
  • उल्लेख के अनुसार सॉकेट का उपयोग करें। सी ++ में, यदि आपको क्रॉस-प्लेटफ़ॉर्म समाधान की आवश्यकता होती है तो ACE या boost जैसी लाइब्रेरी आपको कुछ दिल की धड़कन
  • जावा से C++ या इसके विपरीत कॉल करने के लिए JNI का उपयोग करेंगी। यह शायद सबसे कठिन है, लेकिन सबसे अधिक प्रदर्शन करने वाला है।
सीखने सॉकेट के लिए

, के लिए "java socket tutorial" या "c++ socket tutorial" आप में बहुत सारी जानकारी दे देंगे एक गूगल खोज।

1

आप जावा मूल इंटरफ़ेस (जेएनआई) का उपयोग कर सकते हैं। जेएनआई आपको जावा अनुप्रयोगों से सी पुस्तकालयों को कॉल करने की अनुमति देता है। ध्यान दें कि जेएनआई कॉल सी हैं और सी ++ कॉल नहीं हैं, इसलिए आपको अपने सी ++ फ़ंक्शंस (बाहरी "सी") पर सी कॉलिंग सम्मेलन निर्दिष्ट करना होगा।

जेएनआई को करने के लिए कड़ी मेहनत की प्रतिष्ठा है। यह आसान नहीं है लेकिन यह निश्चित रूप से करने योग्य है। मैं सॉकेट का उपयोग करने के खिलाफ सलाह देंगे। सॉकेट का उपयोग करना आसान तरीका बाहर की तरह लगता है, लेकिन मेरे लिए यह बुरा कीड़े की एक कर सकते हैं खोलने के लिए समान है ...

+0

मैंने SWIG के बारे में सुना है, लेकिन मैंने कभी इसका उपयोग नहीं किया है। क्या यह जेएनआई से आसान है? क्या कोई जानता है? – OscarRyz

0

अधिक जानकारी की आवश्यकता है (लेकिन एक अच्छा सवाल)।

क्या ये दो अलग-अलग कार्यक्रम एक ही समय में चल रहे हैं?

यदि नहीं, और जावा प्रोग्राम को सी ++ लाइब्रेरी कॉल करने की आवश्यकता है, तो जेएनआई उत्तर एक अच्छा समाधान है, लेकिन यह वास्तव में प्रक्रियाओं में काम नहीं करेगा।

प्रक्रियाओं के मामले में, आपको वास्तव में प्रक्रियाओं में संवाद करने का एक तरीका खोजने की आवश्यकता है ... एक साधारण समाधान (शायद सबसे अच्छा नहीं, लेकिन मुझे आपकी सटीक स्थिति नहीं पता) बाइनरी होगी फ़ाइल जो लिखा और पढ़ा गया है ... बस दौड़ की स्थिति से सावधान रहना न भूलें! सॉकेट भी काम कर सकते हैं, लेकिन यदि आपके प्रोग्राम बहुत से संवाद करते हैं, तो यह सीपीयू पावर पर एक हॉग का थोड़ा सा हो सकता है।

6

यह करने के लिए एक आसान तरीका मानक इनपुट और आउटपुट उपयोग कर रहा है:

class MyTest { 
    public static void main(String... args) { 
     System.out.println("carpet"); 
    } 
} // Java 

#include <iostream> 
#include <string> 
int main() { 
    string input; 
    std::getline(std::cin, input); 
    std::cout << "from java: " << input << std::endl; // output: carpet 
} // C++ 

# start by piping java's output to c++'s input 
$ java MyTest | ./my_receive 
1

विकल्प है कि डेव उल्लेख सबसे आम तरीके से कुछ हैं।

जेएनआई समाधान के विस्तार के रूप में, यदि आप जावा और सी ++ के बीच कुछ कच्चा डेटा साझा करना चाहते हैं तो आप सीधे बाइटबफर (जावा 1.4 और आगे) देख सकते हैं। प्रत्यक्ष बाइट बफर आपको सी ++ या जावा पक्ष पर कुछ आकार के बफर आवंटित करने की अनुमति देता है और फिर आसानी से दोनों भाषाओं से बफर तक पहुंचता है; जावा में यह बाइटबफर ऑब्जेक्ट पर विधियों के माध्यम से किया जाता है और सी ++ में आप डेटा में पॉइंटर प्राप्त कर सकते हैं। बाइटबफर आसान हैं यदि आपके पास विनिमय करने के लिए अच्छी जानकारी है और आप इसे जेएनआई विधि में पैरामीटर के रूप में पास नहीं करना चाहते हैं।

सॉकेट दृष्टिकोण शायद ओवरकिल है, लेकिन मुझे यकीन नहीं है कि आप विशेष रूप से क्या करने का प्रयास कर रहे हैं।

0

इसके अलावा, अगर यह शोर में खोया नहीं गया है, तो यदि आप जेएनआई मार्ग का प्रयास करते हैं तो आपकी सहायता के लिए SWIG का उपयोग करें। http://www.swig.org/

0

SOAP का विकल्प भी है लेकिन शायद यह मानना ​​है कि आपको एक ही मशीन पर दो प्रक्रियाएं मिल गई हैं। फिर भी मैं पूर्णता के लिए इसका जिक्र करता हूं।

4

हालांकि एक उत्तर स्वीकार कर लिया गया है, यहां एक महत्वपूर्ण समस्या दोनों भाषाओं के बीच अर्थपूर्ण मेल नहीं है: मान लीजिए कि आपके पास कुछ प्रकार का स्ट्रीम कनेक्शन चल रहा है, आप डेटा कुशलता से कैसे बदलते हैं?

एक समाधान जो मैं सुझा सकता हूं वह Google प्रोटोकॉल बफर है। यह उपप्रोसेस/जेएनआई/सॉकेट समस्या को हल नहीं करता है, लेकिन यह क्या करता है यह आपको स्ट्रीम प्रोटोकॉल पर एक जटिल ऑब्जेक्ट संरचना पारगमन करने का एक शानदार तरीका है।

याद रखें: विशेष रूप से जटिल ऑब्जेक्ट संदर्भों के लिए जेएनआई जटिल है, लेकिन यह कुशल है। सबसे महत्वपूर्ण बात यह है कि उस कुशल संदर्भ स्विच पर डेटा को सही तरीके से पास करना है। जीपीबी + जेएनआई/सब-प्रोसेस सॉकेट डेटा को खींचने के लिए एक एकल संदर्भ स्विच की अनुमति देता है, दोनों तरफ कुशल कोडेक समर्थन के साथ संयुक्त।

संबंधित मुद्दे