2011-10-15 19 views
15

मैं जावा देशी समारोह का उपयोग कर रहा -सी ++/जेएनआई में वेक्टर को जॉबजेक्ट में परिवर्तित करें?

public native ArrayList<String> parseXML(); 

C++ में मेरी देशी समारोह -

vector<string> resultList; 

JNIEXPORT jobject JNICALL Java_Sample1_parseXML 
(JNIEnv *env, jobject obj){ 
    // logic 
    return resultList; // here getting error 
} 

मेरे समस्या यह है कि कैसे resultList (वेक्टर प्रकार) प्रकार jobject में बदलने के लिए है?

+1

+1: यह कल्पना करने से कहीं अधिक कठिन है। ;) –

उत्तर

13

आपको सी ++ में ऐरेलिस्ट के लिए एक रैपर बनाना होगा। कुछ की तरह:

vector <char*> vec; 

jclass clazz = (*env).FindClass("java/util/ArrayList"); 
jobject obj = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V")); 

for (int n=0;n<vec.size();n++) 
{ 
    char* str = (char*) static_cast<char*>(vec[n]); 

    jstring _str = (*env).NewStringUTF(str); 

    (*env).CallVoidMethod(object, (*env).GetMethodID(clazz, "add", "(java/lang/Object)V"), _str); 

} 

return obj; 
अधिक जानकारी के लिए

देखें:

http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html

+3

अच्छा जवाब। लेकिन यह बहुत अच्छा होगा, अगर कोई एसटीएल 'वेक्टर' के लिए एडाप्टर लिखता है जो 'java.util.List' लागू करता है। काफी आकर्षक व्यायाम! –

+0

सही! यह समाधान का समाधान होगा। – Dyonisos

+2

मेरी पैडेंट्री क्षमा करें, लेकिन '(char *) static_cast ' अनावश्यक नहीं है? – moshbear

5

विधि है:

bool add(Object); 

तो हस्ताक्षर है:

"(Ljava/lang/Object;)Z" 

पर अधिक : http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp276

vector <char*> vec; 

jclass clazz = (*env).FindClass("java/util/ArrayList"); 
jobject obj = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V")); 
for (int n=0;n<vec.size();n++) 
{ 
    char* str = (char*) static_cast<char*>(vec[n]); 
    jstring _str = (*env).NewStringUTF(str); 
    (*env).CallBooleanMethod(object, (*env).GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str); 
} 
return obj; 
+2

यह पहले जवाब की लगभग चरित्र-दर-चरित्र प्रति जैसा दिखता है। – moshbear

+3

@moshbear: यह नहीं है। यहां 'CallBooleanMethod'', 'CallVoidMethod'' है। बाकी बल्कि यांत्रिक है, इसलिए समानताएं अपेक्षित हैं। – Mat

+3

पर्याप्त मेला। पिछले उत्तर w.r.t. पर मेरी टिप्पणी '(char *) static_cast 'अनावश्यक होने के बावजूद अभी भी खड़ा है। – moshbear

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