2013-04-15 3 views
6

मैं जावा में लिखे गए प्रोग्राम से सी डीएलएल लोड कर रहा हूं। मैं इस घोषणा के साथ DLL से तरीकों में से एक कॉल करने के लिए सक्षम होना चाहते हैं:शून्य में कनवर्ट करें ** पॉइंटर समकक्ष जावा प्रकार

dll_function(const char* foo1, const char* foo2, const char* foo3, void** bar, size_t* bar2); 

मैं जावा में सही प्रकार की तर्क के साथ इस विधि कैसे कहते हैं? मुझे पता है (सैद्धांतिक रूप से) इसे कैसे कॉल करें, लेकिन मैं क्या जानना चाहता हूं कि मेरे जावा प्रोग्राम से "शून्य **" और "size_t *" कैसे पास किया जाए? असल में, मैं जानना चाहता हूँ शून्य और size_t के लिए क्या "बराबर प्रकार" *** जावा में है ...

मैं सूचक वर्ग पाया, लेकिन यह काम पाने के लिए प्रबंधन नहीं किया? बहुत धन्यवाद :)

+0

आप नहीं करते हैं। अवधारणाओं को मैप करने योग्य नहीं हैं। आपको समझना होगा कि मूल्यों का उपयोग कैसे किया जाएगा और "धोखा"। या एक सी रैपर लिखें। –

उत्तर

1

size_t स्मृति में एक चर के आकार के लिए उपयोग किया जाने वाला एक पूर्णांक है; जैसे कि आपको जावा में unsigned long का उपयोग करके सुरक्षित होना चाहिए।

void* अज्ञात प्रकार की वस्तु के लिए एक सूचक होने की संभावना है। This question, इस मामले पर काफी दिलचस्प है। जावा Object आमतौर पर इस मामले में उपयोग किया जाता है, लेकिन मुझे नहीं पता कि आप उनके बीच कैसे परिवर्तित होंगे, हालांकि this question वहां मदद कर सकता है।

+0

जावा में कोई 'हस्ताक्षरित लंबा' नहीं है ... –

+0

आह, अच्छा बिंदु। उस स्थिति में, 32-बिट कोड में 'लंबा' (क्योंकि यह 64-बिट हस्ताक्षरित पूर्णांक है), या 64-बिट कोड में 'बिगइंटर'। इस पर विचार करते हुए, लॉग इन करें क्योंकि आप वास्तव में जावा कोड में इसके साथ कुछ भी नहीं करते हैं, आप 64-बिट एड्रेसिंग के लिए भी लंबे समय तक दूर हो सकते हैं, जब तक जावा और मूल भाषा के बीच रूपांतरण इसे उलझन में नहीं डाल सकते हैं और बाइनरी को दोबारा परिभाषित कर सकते हैं जैसे कि यह size_t था। – Alan

+1

मैंने जेडीके स्रोत कोड पढ़ा। 'लांग' का उपयोग जेडीके में "पीयर ऑब्जेक्ट्स" को संग्रहीत करने के लिए किया जाता है ('एडब्ल्यूटी ऑब्जेक्ट' के लिए खोजें और यदि आप रुचि रखते हैं तो 'पीडीएटीए पॉइंटर' की तलाश करें)। एंड्रॉइड स्रोत एक ही उद्देश्य के लिए 'लांग' का भी उपयोग करता है। तो मुझे लगता है कि 'लांग' का उपयोग करना सबसे अच्छा अभ्यास है। –

1

मैंने कई साल पहले जावा/जेएनआई/सी प्रोजेक्ट पर काम किया था, और हमें जावा ऑब्जेक्ट्स के भीतर अपारदर्शी सी पॉइंटर्स बनाए रखना था। हमने सी पॉइंटर्स को पकड़ने के लिए जावा पक्ष पर long मानों का उपयोग किया, जो जेएनआई पक्ष पर jlong से void* या जो भी पॉइंटर प्रकार की आवश्यकता थी, में परिवर्तित किया गया था।

चूंकि जावा long प्रकार 64 बिट चौड़ा है, और जेएनआई/सी पॉइंटर्स आमतौर पर 32 बिट्स या 64 बिट्स चौड़े होते हैं, तो हमें उनके बीच कोई समस्या नहीं होती है।

0

मैं अपने समाधान करने की कोशिश की, लेकिन मैं मैं वास्तव में सही ढंग से समझ में नहीं आया लगता है ... लेकिन मैं इस का उपयोग कर मेरी समस्या हल:

import com.sun.jna.ptr.IntByReference; 

मुझे लगता है कि मेरी जावा कार्यक्रम में की तरह सी समारोह कहा जाता है:

IntByReference myVoidPointerPointer = new IntByReference(); 
myCLibrary.myCFunction(myVoidPointerPointer); 

सी समारोह "myCFunction" इस तरह दिखता है:

void myCFunction(void** parameter); 

क्या यह ठीक है? यह काम कर रहा है, लेकिन मैं सोच रहा था कि यह करने का सही तरीका है या नहीं।

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