2010-02-11 11 views
7

मुझे सी ++ पुस्तकालयों के लिए उपयोग किए जाने वाले जेएनए में कई संदर्भ ऑनलाइन (स्टैक ओवरफ्लो सहित) पाए गए हैं, लेकिन जेएनए दस्तावेज़ों में मुझे जो कुछ भी मिल सकता है, वह इंगित करता है कि यह संभव है। विशेष रूप से सी ++ वर्ग को लपेटने का कोई तरीका नहीं प्रतीत होता है।जावा मूल पहुंच सी ++ नहीं करता है, है ना?

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

उत्तर

9

यह प्रश्न क्या है how to call C++ instance methods using JNA पूछ रहा है, और यह संभव है, लेकिन आपको कुछ काम करने जा रहे हैं। विशेष रूप से, आपको एक रैपर लिखना होगा जो extern "C" कोई भी कार्य है जिसे आपको वास्तव में आमंत्रित करने की आवश्यकता है।

किसी भी मनमाने ढंग से type* function() परिभाषा के लिए आप com.sun.jna.Pointer लौटने के रूप में जेएनए का उपयोग करके विधि को मानचित्र कर सकते हैं, लेकिन आप जेएनए से सी ++ ऑब्जेक्ट पर विधियों का आह्वान नहीं कर पाएंगे।

इस के लिए एक सरल समाधान का एक सी इंटरफ़ेस पुस्तकालय कि बस आप के लिए वस्तुओं पर विधि का आह्वान लिखने के लिए होगा ... तो आप अपने सी से एक सी विधि का निर्यात कर सकता है अगर आप कुछ सदस्य समारोह foo() है ++ कोड:

extern "C" void bar(type* var){ 
    var->foo(); 
} 

स्पष्ट रूप से यह आपके लिए कुछ काम जोड़ देगा ... लेकिन मुझे संदेह है कि JNI पर स्विच करने के लिए ओवरहेड समान होगा।

JNA एक ही रास्ता है, जिसमें विधि DLL में निर्यात किया जाता है के बारे में परवाह है - और कि बिना सी ++ सजावट (इसलिए extern "C") होना चाहिए, इसलिए आप जो कुछ प्रकट किए बिना किसी भी तरह के विधि के भीतर करने की जरूरत है क्या कर सकते हैं जिस तरीके से आप कॉल करते हैं।

उपरोक्त मेरे उत्तीर्ण उदाहरण में, इसका मतलब है कि foo(), जब तक कि इसे डीएलएल के भीतर परिभाषित किया गया है, वास्तव में इसका खुलासा नहीं किया जाना चाहिए। चूंकि यह एक सी ++ फ़ंक्शन है, इसलिए जेएनए इसे सीधे कॉल नहीं कर सकता है, लेकिन इसे एक ऐसे फ़ंक्शन के भीतर से बुलाया जा सकता है जिसे जेएनए कॉल कर सकता है, यही कारण है कि मेरा प्रस्तावित समाधान काम करता है।

तो, हाँ, आप एक ही समारोह में सभी सदस्य कार्यों (निर्माण, संचालन, नष्ट) को कॉल को पूरी तरह से समाहित कर सकते हैं और जेएनए परवाह नहीं होगा।

+0

महान जवाब धन्यवाद।यदि एक नियमित सी विधि फ़ंक्शन बॉडी के अंदर C++ क्लास इंस्टेंस बनाता है, तो सदस्य फ़ंक्शन को कॉल करता है, और फिर ऑब्जेक्ट को हटा देता है, क्या मैं सीधे सदस्य फ़ंक्शंस के इस बाध्यकारी से बच सकता हूं? या जेएनए किसी भी तरह से "जान" और अस्वीकार कर देगा जो अन्यथा सी कार्यों के रूप में दिखाई देता है लेकिन वह अपने शरीर के अंदर सी ++ का उपयोग करता है? –

+1

@carneades - टिप्पणियों की अनुमति से अधिक स्थान की आवश्यकता है, पोस्ट में मेरा संपादन देखें। –

+0

धन्यवाद मार्क, यह पूरी तरह से काम किया! बाहरी "सी" शून्य rtattempt (शून्य) { आरटीऑडियो :: आरटीऑडियो ऑडियो; std :: cout << "num devices:" << audio.getDeviceCount() << std :: endl; } –

1

आप सही पुस्तकालयों को accesing के लिए सही जेएनए है। मुझे लगता है कि आपको जावा - कॉम ब्रिज की आवश्यकता है। यदि यह मामला है वहाँ कुछ मुफ्त विकल्प हैं:

JCOM http://sourceforge.net/projects/jcom

याकूब http://sourceforge.net/projects/jacob-project

मैं अच्छे परिणाम के साथ पास में याकूब का उपयोग किया है, लेकिन मुझे लगता है कि यह एक छोटा सा पुराना है।

2

Swig आज़माएं। यह आपके लिए सी ++ कक्षाओं के लिए रैपर बनाएगा।

2

BridJ जेएनए का एक आध्यात्मिक बच्चा है जो कुछ सीमित सी ++ समर्थन (+ JNAerator से पूर्ण समर्थन) जोड़ता है। यदि आप बहुत अधिक टेम्पलेट्स का उपयोग नहीं कर रहे हैं यह सिर्फ काम कर सकते हैं ...

(अस्वीकरण: मैं BridJ & JNAerator के लेखक हूँ)

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