2010-11-12 7 views
7

मेरे पास सी ++ में एक विधि है जो तर्क के रूप में युगल की एक सरणी लेती है। मैं जावा से इस विधि को बुला रहा हूं और युगल की एक सरणी पास करने की आवश्यकता है। सी ++ दिनचर्या सरणी के मानों को पढ़ता है और संशोधित करता है और मुझे जावा में उन अद्यतन मानों की आवश्यकता होती है। मैं यह कैसे करु?मैं स्विग का उपयोग कर जावा से सी ++ में सरणी कैसे पास करूं?

उदाहरण के लिए, सी ++ दिनचर्या ले:

void myMethod(double *values, int size) { 
    for (int i=0; i < size; i++) { 
     values[i] = 2*values[i]; 
    } 
} 

और जावा कोड:

double[] values = { 1.3, 1.1 }; 
myMethod(values,values.length); 
System.out.println(values[0]); // prints 2.6 

मुझे लगता है कि MyMethod के लिए एक कॉल ऊपर कॉल की तरह नहीं बनाया जा सकता है ... या यह कर सकते हैं ? और इस काम को करने के लिए स्विग में क्या आवश्यक है। अगर मैं उपरोक्त की तरह कोई कॉल नहीं कर सकता, तो मैं अपने मूल्यों को सी ++ कोड में कैसे प्राप्त करूं?

+1

एसडब्ल्यूआईजी को मेरे उत्तर से संबोधित किया गया है। बाकी के उत्तरों विकल्पों पर चर्चा करते हैं। –

+0

हां, बहुत बहुत धन्यवाद एंडी! आप मेरे प्रश्न को समझते हैं और एक बहुत ही उचित उत्तर देते हैं ... मैं अभी भी अधिक उत्तरों की तलाश में हूं। मुझे विशेष रूप से दिलचस्पी है कि ज्यादातर लोग क्या करते हैं, क्योंकि यह स्थिति हर समय आती है। क्या अधिकांश लोग स्विग 2 का उपयोग करते हैं? क्या अधिकांश लोग अपना खुद का टाइपमैप लिखते हैं? वे दोनों मेरे लिए चरम सीमा की तरह ध्वनि। – Jason

+0

यदि मुझे सरणी को सी ++ में मैन्युअल रूप से कॉपी करना है तो यह ठीक है। अगर मैं सी ++ में एक सरणी आवंटित कर सकता हूं और जावा में मानों तक पहुंचने के लिए विशेष तरीकों का उपयोग करना है, तो यह ठीक है। इस तरह के मामलों में ज्यादातर लोग क्या करते हैं? – Jason

उत्तर

6

carrays.i का उपयोग करें!

public static SWIGTYPE_p_double new_double_array(int nelements) { 
    long cPtr = SimulatorModuleJNI.new_double_array(nelements); 
    return (cPtr == 0) ? null : new SWIGTYPE_p_double(cPtr, false); 
    } 

    public static void delete_double_array(SWIGTYPE_p_double ary) { 
    SimulatorModuleJNI.delete_double_array(SWIGTYPE_p_double.getCPtr(ary)); 
    } 

    public static double double_array_getitem(SWIGTYPE_p_double ary, int index) { 
    return SimulatorModuleJNI.double_array_getitem(SWIGTYPE_p_double.getCPtr(ary), index); 
    } 

    public static void double_array_setitem(SWIGTYPE_p_double ary, int index, double value) { 
    SimulatorModuleJNI.double_array_setitem(SWIGTYPE_p_double.getCPtr(ary), index, value); 
    } 

कौन सा मुझे सी जावा में सरणियों उपयोग करने के लिए ... इस मेरी जरूरतों को हल करती है की अनुमति देता है और है:

Swig docs on carrays

%include carrays.i 
%array_functions(double, double_array) 

इन दो पंक्तियों को मेरी मॉड्यूल में निम्न कोड बनाने देखें मेरी समस्या के लिए सबसे अच्छा समाधान। जवाबों के लिए आप सबका धन्यवाद!

+0

एक आसान दृष्टिकोण पोस्ट करने के लिए धन्यवाद। मुझे लगता है कि आपको अपना जवाब स्वीकार करना चाहिए। Carrays के लिए SWIG 2.0 लिंक http://www.swig.org/Doc2.0/SWIGDocumentation.html#Library_carrays पर है। –

+0

क्या यह सबसे तेज़ तरीका है? मुझे लगता है कि आपको अपने जावा सरणी में तत्वों की संख्या के साथ SWIGTYPE_p_double को कॉल करने की आवश्यकता है, फिर प्रत्येक आइटम को नई सरणी में कॉपी करें, फिर नई सरणी पर C++ में प्रोसेसिंग करें, फिर प्रत्येक आइटम को जावा सरणी में कॉपी करें। क्या प्रत्यक्ष मेमोरी एक्सेस करने का कोई तरीका है और बस दो भाषाओं के बीच एक पॉइंटर पास करें? या जावा और सीओक्स के बीच मेमोरी मैनेजमेंट में अंतर के कारण ये अतिरिक्त प्रति ऑपरेशन ऐसा करने का एकमात्र तरीका है? – LaserJesus

0

यह मानते हुए कि आप ऐसा नहीं कर सकते org.life.java क्या पता चलता है ...

आप IPC's और भी फ़ाइलें देख सकते हैं।

एक और चीज जो आप कर सकते हैं वह सी ++ कोड और सरणी को तर्क के रूप में एक्सई के पथ से गुजरकर प्रक्रिया बनाना है। [Runtime.exec (java.lang.String, java.lang.String [])] [2] ऐसा करने में सक्षम होना चाहिए।

[2]: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec(java.lang.String, java.lang.String [])

0

यदि यह सिर्फ इतना है कि एक विधि है, यह फिर से लिखने। यदि आपके पास एक (अधिक) बड़ा सी ++ कोड बेस है, तो आपको पोर्ट की आवश्यकता है, JNI (या सरल JNA) का उपयोग करें। यह कोड ओवरहेड का थोड़ा सा जोड़ता है, लेकिन यह करने योग्य है।

+0

उम ... यह वही है जो मैं कर रहा हूं ... जेएनआई का उपयोग कर क्योंकि यह एक बड़ा कोड बेस है। इसलिए मैंने जेएनआई रैपर बनाने के लिए स्विग का उपयोग करना चुना ... क्योंकि स्विग _much_ सरल है। – Jason

1

SWIG typemaps इसे अनुमति देनी चाहिए। एसडब्ल्यूआईजी 2.0 दस्तावेज इस example in Python दिखाता है।

जावा के साथ, आप अपने एसडब्ल्यूआईजी टाइपमैप के अंदर जेएनआई कोड का उपयोग करेंगे। जेएनआई विधियों को प्राप्त/रिलीजअरेरेमेंट प्रदान करता है। मुझे लगता है कि आप typemap(in) में मूल सरणी प्राप्त कर सकते हैं, फिर इसे typemap(argout) में रिलीज़ करें।

std_vector.i में मौजूदा SWIG टाइपमैप का उपयोग करके, अपने सरणी को std :: वेक्टर में कॉपी करने का एक और तरीका होगा।

+0

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

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