2012-10-04 8 views
6

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

यह कैसे हो सकता है? मैं कैसे सुनिश्चित कर सकता हूं कि सी ++ परत की सीर-स्ट्रीम जावा परत की स्टीडर-स्ट्रीम में समाप्त हो जाती है?

JVM सभी मामलों में एक ही है,

JRE संस्करण: 6.0_27-B07, जावा वी एम: जावा हॉटस्पॉट (टीएम) क्लाइंट वी एम (20.2-B06 मिश्रित मोड windows-x86)

+2

शायद यह संभवतः यह है कि जेवीएम को सी ++ ' –

+2

@ श्रीहर चिलकपाटी में लागू किया जा रहा है, यह क्यों मायने रखता है? – user93353

+0

चूंकि JVM को 'C++' में लागू किया गया है, इसलिए जावा परत सी ++ परत के शीर्ष पर होगी। तो मुझे लगता है कि शायद यह हो रहा है क्योंकि जावा लेयर कंसोल पढ़ रहा है जिस पर सी ++ संदेश मुद्रित होते हैं। यह भी हो सकता है क्योंकि चूंकि 'jni dll' द्वारा पोस्ट की गई त्रुटियों की निगरानी JVM द्वारा की जा रही है। –

उत्तर

2

करने के लिए सीधे अपने प्रश्न का उत्तर दें, std :: cerr केवल System.out में दिखाया जा सकता है यदि वे वही वर्णनकर्ता साझा करते हैं।

यदि यह वास्तव में कुछ कंप्यूटरों पर होता है और दूसरों को नहीं, तो मुझे डिफ़ॉल्ट System.out और System.err के जावा कार्यान्वयन में अंतर दिखाई देगा। आपने समान जावा इंस्टॉलेशन, केवल अलग-अलग कंप्यूटरों को इंगित नहीं किया है। जावा अपने डिफ़ॉल्ट आउटपुट स्ट्रीम कार्यान्वयन के बारे में कोई गारंटी नहीं देता है।

अब, क्योंकि हर तरफ बफरिंग और फ़ाइल वर्णनकर्ता एक दूसरे के साथ बेबुनियाद हैं, केवल दो संभावनाएं मौजूद हैं:

1) आप DLL स्रोत के लिए उपयोग किया है और सभी मैं/हे अपने को पारित कर दिया उपयोग करने के लिए बदल सकते हैं System.out/त्रुटि जावा स्ट्रीम में।

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

उम्मीद है कि आप # 1 चुनने में सक्षम हैं।

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