2009-12-09 11 views
5
से वापस पारित कर दिया

मैं इस तरह के रूप में एक भी निर्यात किया विधि के साथ एक सी ++ DLL है कहते हैं: यानी यह केवल वर्ग है कि वास्तव में तरीकों में शामिल है का एक उदाहरण देताJNA बुला सी ++ घटना पर तरीकों DLL

CustomerProcessor* getInstance(); 

मैं कॉल करने की जरूरत है।

मैं जानता हूँ कि मैं जावा में एक कक्षा JNA (विस्तार com.sun.jna.Library) का उपयोग करने के लिए getInstance() विधि मैप कर सकते हैं, एक com.sun.jna.Pointer में लौट आए CustomerProcessor उदाहरण की दुकान।

क्या मैं किसी भी तरह से इसे ग्राहकप्रोसेसर क्लास में मैप कर सकता हूं ताकि मैं इसके तरीकों को कॉल कर सकूं (और यदि ऐसा है, तो कैसे?

+0

इस प्रश्न के अनुसार आप जेएनए में सी ++ विधियों को कॉल नहीं कर सकते: http://stackoverflow.com/questions/1556421/use-jni-instead-of-jna-to-call-native-code – dfa

उत्तर

2

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

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

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

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

+0

मैं वास्तव में पहले से ही एक सी ++ रैपर लिखने के मार्ग से नीचे चला गया, लेकिन यह सोच रहा था कि इसे खत्म करने के लिए वैसे भी था। स्पष्टीकरण के लिए बहुत धन्यवाद। – William

1

जेएनएरेटर (http://code.google.com/p/jnaerator/) जो भी आप पूछते हैं उसे करने में सुविधा दे सकते हैं। इसमें demangling और vtable पहुंच के लिए कुछ समर्थन है (इस विधियों को कॉल करने के लिए आवश्यक)।

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