2010-10-24 4 views
24

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

MessageConsole jniConsole = new MessageConsole("Opereffa Output", null); 
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { jniConsole }); 
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(jniConsole); 
MessageConsoleStream stream = jniConsole.newMessageStream(); 
System.setOut(new PrintStream(stream)); 
System.setErr(new PrintStream(stream)); 

जब प्लगइन एक अपनी कार्यक्षमता करता है, System.out के किसी भी उपयोग वास्तव में ग्रहण के भीतर कंसोल के लिए चला जाता है। लेकिन जेएनआई द्वारा उपयोग किए जाने वाले मूल कोड भी आउटपुट स्ट्रीम को लिखते हैं, जिसे मैं नहीं पकड़ सकता। विकास के दौरान, जेएनआई से आउटपुट ग्रहण उदाहरण के कंसोल पर जाता है जिसने चलने वाले इंस्टेंस को लॉन्च किया है, जिसमें प्लगइन शामिल हैं।

तो मैं कंसोल में जेएनआई आउटपुट कैसे प्रदर्शित करूं?

+2

मूल कोड में कौन से फ़ंक्शन लॉग संदेश हैं? printf, fprintf, डालता है ... ... क्या आप लॉगिंग फ़ंक्शन को बदलने, कोड को फिर से लिखने के लिए स्वतंत्र होंगे? –

+0

चूंकि जेएनआई शामिल है: पोर्टेबल एक समाधान होना चाहिए? कम से कम किस प्लेटफॉर्म पर काम करना चाहिए? –

उत्तर

0

आप वास्तव में नहीं कर सकते हैं। मूल डीएलएल stdio विधियों का उपयोग करता है जिन्हें आप जावा से एक्सेस नहीं कर सकते हैं। यदि आप System.out पर लिखते हैं, तो जावा रनटाइम अंततः उसी विधियों का उपयोग करता है लेकिन स्पष्ट कारणों से, System.out को C रनटाइम को अंतर्निहित करने का कोई प्रभाव नहीं पड़ता है।

हार्डवेयर समाधान है: दूसरा मॉनीटर प्राप्त करें ताकि आप टर्मिनल देख सकें जिसमें आपने हर समय एक्लिप्स शुरू किया था।

1

आप जावा में करते हैं, लेकिन मूल रूप से उसी तरह से stdout को रीडायरेक्ट करने के लिए freopen का उपयोग करने का प्रयास कर सकते हैं। सवाल यह है कि क्या यह काम करेगा यदि आपने इसे अपनी प्लगइन में इस्तेमाल किया है (एक नया जेएनआई डीएल के साथ): इसे कंसोल आउटपुट करने वाले डीएलएल के भीतर से इस्तेमाल करने की आवश्यकता हो सकती है, मुझे डीएलएल में धाराओं के बीच बातचीत का कोई अंदाजा नहीं है । यदि stdout पूरी प्रक्रिया के लिए साझा स्ट्रीम को संदर्भित करता है, तो शायद यह काम करेगा।

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