2010-07-30 18 views
5

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

लेकिन जब मैं अपने जावा कोड से इन देशी तरीकों का संदर्भ मैं java.lang.UnsatisfiedLinkError myPackage.myClass.myMethod (आई) वी

लेकिन मुझे पता है कि DefineClass myPackage.myClass और मैं के लिए एक वर्ग वस्तु लौटे पता है कि myMethod (I) V उस वर्ग पर एक विधि के रूप में पंजीकृत किया गया है।

मुझे यह विफलता मिलती है जैसे कि यह मुख्य() को निष्पादित करने वाला है - जहां मेरी मूल विधि को कॉल (समय के लिए, परीक्षण के लिए) है।

एक परीक्षण के रूप में, मैंने यह देखने के लिए एक ही जेएनआईएनवी पर दो बार DefineClass को कॉल करने का प्रयास किया। मुझे एक डुप्लिकेट क्लास परिभाषा त्रुटि मिलती है। मैंने इसे परिभाषित करने के बाद FindClass() को कॉल करने का भी प्रयास किया है और जेएनआईएनएनवी परिभाषित कक्षा का संदर्भ देता है।

इस प्रकार मैं निश्चित रूप से कक्षा को गतिशील रूप से बना रहा हूं, लेकिन जब मैं इसकी विधियों का उल्लेख करने की कोशिश करता हूं तो यह विफल रहता है।

कोई भी विचार? सभी इनपुट की सराहना की।

प्लेटफ़ॉर्म: 64 बिट XP पर विंडोज़, 32 बिट कोड।

+0

क्या आपके पास अपने पथ में कहीं भी आपके डीएल का पुराना संस्करण हो सकता है? –

+0

जब आपने अपना डीएलएल संकलित किया तो क्या आपने फ़ंक्शंस निर्यात किया था? –

+0

रोमैन: मेरे कार्यों को निर्यात करने की आवश्यकता नहीं है और डीएलएल संस्करण अप्रासंगिक है - डीएलएल जो रजिस्टरनेट्स() के साथ कार्यों को पंजीकृत कर रहा है वह डीएलएल कार्यों की आपूर्ति कर रहा है। फ़ंक्शंसनेटिव() को कॉल करने पर परिभाषा उपलब्ध होती है। –

उत्तर

2

ऐसा लगता है कि आप DefineClass() का उपयोग करके मूल विधि को परिभाषित नहीं कर सकते हैं और उस मूल विधि को सीधे अपने इंजेक्शन कोड से कॉल कर सकते हैं। आपके इंजेक्शन क्लास (जावा बाइट कोड के रूप में) में आपको ट्रामपोलिन विधि होनी चाहिए जो तब आपके मूल तरीकों को कॉल करे। केवल तभी यह काम करेगा। मुझे काम करने के लिए तीन दिन लगे।

एक और गोचा यह सुनिश्चित करता है कि आपका इंजेक्शन कोड मान्य है। जिस कोड को मैं कोशिश कर रहा था वह वैध दिखता था, लेकिन करीब निरीक्षण पर मैं निरंतर पूल से 4 बाइट आकार स्थिर स्थिरता को 8 बाइट निर्देश के लिए एक ऑपरेंड के रूप में खींच रहा था। तो यह सत्यापनकर्ता विफल रहा। एक बार यह तय किया गया था (और मूल trampoline), यह सब काम किया।

हालांकि उन सभी विभिन्न क्रमिकताओं के माध्यम से वहां पहुंचने के लिए मुझे 3 दिन का प्रयास करना पड़ा। हालांकि काम कर रहा था जब अच्छा महसूस किया।

ट्रैम्पोलिन कैसे करें? जावा एसडीके के साथ जहाज के उदाहरण (सी में) देखें। वे काफी लंबे हैं और यहां पोस्ट करने के लिए उपयुक्त नहीं हैं।

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

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