2011-04-29 5 views
14

मैं जेएनआई का उपयोग कर सी से जावा तक तारों की एक सरणी वापस करना चाहता हूं। मैंने देखा कि मैं NewObjectArray() इस तरह से इस्तेमाल कर सकते हैं:जेएनआई: अग्रिम में आकार जानने के बिना नौकरी का पता लगाएं

JNIEXPORT jobjectArray JNICALL Java_Array_initStringArray(JNIEnv *env, jclass cls, jint size) 
{ 
jclass stringCls = (*env)->FindClass(env, "Ljava/lang/String;"); 
if (stringCls == NULL) return NULL; 

jstringArray result = (*env)->NewObjectArray(env, size, StringCls, NULL); 
if (result == NULL) return NULL; 
... 
} 

लेकिन यहाँ, मैं int size पैरामीटर पता नहीं है: मैं तार मैं अपने सरणी को भरने के लिए इस्तेमाल करेंगे की संख्या पता नहीं है। तो क्या पहले से ही सरणी के आकार को जानने के बिना jobjectArray बनाने का कोई तरीका है?

कुछ खाली सरणी बनाने और फिर उस सरणी में एक करके जॉबेज जोड़ने की तरह कुछ?


संपादित: समाधान एडविन के रूप में एक ArrayList का उपयोग कर

jclass arrayClass = (*jenv)->FindClass(jenv, "java/util/ArrayList"); 
    if (arrayClass == NULL) return NULL; 

jmethodID mid_init = (*jenv)->GetMethodID(jenv, arrayClass, "<init>", "()V"); 
    if (mid_init == NULL) return NULL; 

jobject objArr = (*jenv)->NewObject(jenv, arrayClass, mid_init)); 
    if (objArr == NULL) return NULL; 

mid_add = (*jenv)->GetMethodID(jenv, arrayClass, "add", "(Ljava/lang/Object;)Z"); 
    if (mid_add == NULL) return NULL; 

सुझाव दिया तो एक पाश में मैं एक नई वस्तु मैं ArrayList को जोड़ने की जरूरत है के लिए एक jobject obj बनाएँ:

jboolean jbool = (*jenv)->CallBooleanMethod(jenv, objArr, mid_add, obj); 
    if (jbool == NULL) return NULL; 

उत्तर

10

यदि आप बैकिंग स्टोर (सरणी) बढ़ाना चाहते हैं तो आप इसे जोड़ते हैं, java.util.ArrayList का उपयोग करें। इसका अर्थ कुछ और जेएनआई कॉल (ऑब्जेक्ट सेट अप करने के लिए) हो सकता है, लेकिन आपके मामले में ऐसा लगता है कि यह प्रयास के लायक है।

+0

दाएं। मैं सोमवार को इसे देख लूंगा। – leochab