2012-05-30 14 views
18

से अधिक सूचियों का वैक्टर सूची में कन्वर्ट मैं सेल्सियस तक ++ JNI से अधिक जावादर्रा, वापस करने और JNI

List< List<MyPoint> > points; 

से गुजरती हैं और करने के लिए

std::vector< std::vector<MyPoint> > 

प्रक्रिया कन्वर्ट इस वैक्टर और वापस जाने के लिए की जरूरत है

List< List<MyPoint> > 
  1. सूचियों की कितनी सही पास और वापसी सूची?
  2. वस्तुओं और पिछड़े के वेक्टर के वेक्टर में वस्तुओं की सूचियों की सूची कैसे परिवर्तित करें?
+3

आप की कोशिश की [बड़ा घूँट] (http://www.swig.org/), विशेष रूप से [एसटीएल के साथ बड़ा घूँट] (है http://www.swig.org/Doc2.0/Library.html# Library_stl_cpp_library)? यह आपके लिए आवश्यक जेएनआई गोंद कोड उत्पन्न करेगा। –

+0

नहीं, इस समस्या में स्विग का उपयोग अस्वीकार्य है - केवल मानक उपकरण। – George

+0

@WdF: यह अस्वीकार्य क्यों है? कम से कम आप कर सकते हैं स्विग आउट करने का प्रयास करें और देखें कि यह किस प्रकार का जावा/जेएनआई कोड उत्पन्न करता है। स्विग स्वचालित रूप से स्वचालित रूप से हाथ से लिखे गए कोड का उपयोग करके किया जा सकता है। –

उत्तर

14

रूप बाइंडरों के उपयोग हो सकता है।

  1. के रूप में वस्तुओं (ओ) कंटेनर (सी) जावा वर्ग
  2. जावा कोड से वस्तुओं (ओ) के
  3. पास सरणी देशी हिस्सा
  4. सी में सरणी वेक्टर से बनाएं ++ कोड के लिए बनाएं
  5. नई गणना वैक्टर
  6. कंटेनर (सी) की सरणी
  7. बिल्ड और (ओ) कंटेनरों के
  8. वापसी सरणी (सी)
वस्तुओं में डालने

कोड लागू:

जावा भाग पर:

1 - अंक की सूची से सरणी बनाएँ

ग पर ++ हिस्सा:

2 - निर्माण इनपुट वेक्टर

std::vector<CurvePoint> src_line; 

jclass java_points_cls = env->FindClass("myPointClass"); 
jmethodID java_mid = env->GetMethodID(java_points_cls, "<init>", "(II)V");  
jfieldID fidX = env->GetFieldID(java_points_cls, "x", "I"); 
jfieldID fidY = env->GetFieldID(java_points_cls, "y", "I"); 

int srcCount = env->GetArrayLength(srcLines); 

for (int i=0; i < srcCount; i++) 
{ 
    jobject cur_pnt = env->GetObjectArrayElement(srcLines, i); 

    LinePoint src_point;   

    src_point.x = env->GetIntField(cur_pnt, fidX); 
    src_point.y = env->GetIntField(cur_pnt, fidY);  

    src_line.push_back(src_point); 
} 

3 - गणना lines

4 - निर्माण उत्पादन सरणी

jclass java_line_cls = env->FindClass("myLinesClass"); 

jmethodID java_line_add = env->GetMethodID(java_line_cls, "addPoint", "(II)V"); 
jmethodID java_line_init = env->GetMethodID(java_line_cls, "<init>", "()V"); 

jobjectArray resLines = (jobjectArray) env->NewObjectArray(lines.size(),  java_line_cls, 0); 

for(int i = 0; i < lines.size(); ++i) 
{ 
    jobject cur_line = env->NewObject(java_line_cls, java_line_init); 
    for(int j = 0; j < lines[i].size(); ++j) 
     env->CallVoidMethod(cur_line, java_line_add, 
           lines[i][j].x, 
           lines[i][j].y); 
    env->SetObjectArrayElement(resLines, i, cur_line); 
} 

return resLines; 

जावा हिस्सा

5 - लौटे सरणी

+2

ठीक है, यह जावासीपीपी से बेहतर कैसे है? –

+2

केवल मानक उपकरण का उपयोग किया जाना चाहिए। परियोजना के लिए यह आवश्यकता है। किसी अन्य मामले में JavaCpp या SWIG का उपयोग किया जा सकता है। मुझे JavaCpp बेहतर संस्करण के रूप में मिलता है) – George

+0

आह, मैं देखता हूं ... हालांकि संदर्भ के रूप में SWIG या JavaCPP के आउटपुट का उपयोग करना उपयोगी हो सकता है मुझे लगता है :) –

2

जैसा कि मैं इसे जेएनआई संदर्भ से समझता हूं, जेएनआई केवल आदिम प्रकारों या वस्तुओं के एक-आयामी सरणी के साथ काम कर सकता है।

क्योंकि जावा के पक्ष में, सूची को सरणी में अनुवाद करना पड़ा। फिर, मूल भाग में सरणी पास हो गई और तत्वों की संख्या। वांछित वेक्टर और संसाधित करने जा रहा है। दो सरणी के परिणामस्वरूप रिटर्न (सभी समोच्चों के साथ सरणी और प्रत्येक समोच्च में अंक की संख्या के साथ सरणी) और समोच्चों की संख्या। परिणामस्वरूप सरणी जावा के किनारे सूचियों की सूची में एकत्र की जाती है।

हालांकि समस्या पूरी तरह से हल नहीं होती है, क्योंकि जेएनआई मूल भाग में मौजूदा आइटम के लिए स्मृति आवंटित नहीं कर सकता है। इसलिए जावा के पक्ष में उनके लिए स्मृति आवंटित करने के लिए डेटा को निकालने के लिए आवश्यक है, और मूल में भरें।

एक संभावित हल मैं मानक उपकरणों के साथ इस समस्या का समाधान इस तरह बड़ा घूँट या JavaCpp

+0

[जावासीपीपी] के लिए +1 (http://code.google.com/p/javacpp/) :) बीटीडब्लू, हम जावा में किए जा सकने वाले जेएनआई में कर सकते हैं, यह सिर्फ एक पिटा और वास्तव में अक्षम है। –

+1

@ सैमुएलऑडेट जावासीपीपी के साथ अच्छा काम - मैं आमतौर पर एसडब्ल्यूआईजी के साथ काम करता हूं, लेकिन जावासीपीपी वास्तव में अच्छा दिखता है। मुझे गहराई से देखना है :) धन्यवाद! –

1

तुम भी उपयोग कर सकते हैं से लाइनों की सूची बनाएं यह project। यह जेवीआई को देशी मूल की तरह जावा कक्षाओं का उपयोग करने की अनुमति देगा।

3
JNIEXPORT jobjectArray JNICALL Java_ProcessInformation_getAllProcessPid (JNIEnv*env,jobject obj) { 

    vector<string>vec; 

    vec.push_back("Ranjan.B.M"); 

    vec.push_back("Mithun.V"); 

    vec.push_back("Preetham.S.N"); 

    vec.push_back("Karthik.S.G"); 

    cout<<vec[0]; 

    cout<<vec[0]; 

    jclass clazz = (env)->FindClass("java/lang/String"); 

    jobjectArray objarray = (env)->NewObjectArray(vec.size() ,clazz ,0); 

    for(int i = 0; i < vec.size(); i++) { 

     string s = vec[i]; 

     cout<<vec[i]<<endl; 

     jstring js = (env)->NewStringUTF(s.c_str()); 

     (env)->SetObjectArrayElement(objarray , i , js); 

    } 

    return objarray;  

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