2011-07-19 15 views
11

मेरे जावा कोड में मेरे पास 2 डी फ्लोट सरणी float[x][4] floatArray है। यहां x 1 और 25 के बीच हो सकता है। मुझे JNI के माध्यम से C++ विधि में इस 2 डी फ्लोट सरणी को पास करना होगा। मेरे JNI विधिफ्लोट पास करने का सबसे आसान तरीका [] [] से सी ++ जेएनआई

jboolean MyJNIMethod(JNIEnv * env, jobject obj, jobjectArray myArray) 
{ 
    //how to convert this myArray to something that can be safely passed to C++ method below 
} 
MyJNIMethod अंदर

मैं एक C++ विधि कॉल और इस विधि

bool MyCplusPlusMethod(float coordinates[][4]) 
    { 

    } 

मैं ठीक से jobject परिवर्तित फ्लोट करने में एक कठिन समय चल रहा है के लिए 2 डी नाव सरणी जावा से लिया पारित करने के लिए है [] [] देशी विकास ज्ञान की कमी के कारण। क्या कोई मुझे सबसे सरल और सुरक्षित संभव तरीका बता सकता है? धन्यवाद

+2

आप इस आसान बनाने में कर सकते हैं:

static void releaseMatrixArray(JNIEnv *env, jobjectArray matrix) { int size = (*env)->GetArrayLength(env, matrix); for (int i = 0; i < size; i++) { jfloatArray oneDim = (jfloatArray) (*env)->GetObjectArrayElement(env, matrix, i); jfloat *elements = (*env)->GetFloatArrayElements(env, oneDim, 0); (*env)->ReleaseFloatArrayElements(env, oneDim, elements, 0); (*env)->DeleteLocalRef(env, oneDim); } } 

रिहाई स्थानीय सरणी संदर्भ जावा पंक्ति-प्रमुख 1 डी सरणी, और फ्लोट में गुजर रही [] [4]। सी ++ में, 1 डी और 2 डी सरणी स्मृति में समान दिखती हैं। –

+0

जेएनआई पर एक-आयामी सरणी पारित करने के लिए दूसरा सुझाव। याद रखें कि आपको आकार को पास करने की भी आवश्यकता होगी। – jackrabbit

+0

मैंने जेएनआई और सी ++ के अंदर वेक्टर <वेक्टर > का उपयोग करने का निर्णय लिया। अब मैं जेएनआई में फ्लोट [] [] पढ़ रहा हूं। वेक्टर > पॉप्युलेटिंग> और इसे C++ –

उत्तर

16

कुछ इस तरह काम करना चाहिए:

jboolean MyJNIMethod(JNIEnv * env, jobject obj, jobjectArray myArray) 
{ 
    int len1 = env -> GetArrayLength(myArray); 
    jfloatArray dim= (jfloatArray)env->GetObjectArrayElement(myArray, 0); 
    int len2 = env -> GetArrayLength(dim); 
    float **localArray; 
    // allocate localArray using len1 
    localArray = new float*[len1]; 
    for(int i=0; i<len1; ++i){ 
    jfloatArray oneDim= (jfloatArray)env->GetObjectArrayElement(myArray, i); 
    jfloat *element=env->GetFloatArrayElements(oneDim, 0); 
    //allocate localArray[i] using len2 
    localArray[i] = new float[len2]; 
    for(int j=0; j<len2; ++j) { 
     localArray[i][j]= element[j]; 
    } 
    } 
    //TODO play with localArray, don't forget to release memory ;) 
} 

ध्यान दें कि यह रूपरेखा है। यह संकलन नहीं;) (मैं इसे इस overstacks 'संपादक में लिखा था)

अपनी कक्षा में आप घोषित करना चाहिए देशी विधि:

public native void myJNIMethod(float[][] m); 

और अपने ग कोड में इसी:

JNIEXPORT jboolean JNICALL Java_ClassName_methodName (JNIEnv *, jobject, jobjectArray); 

यहां JNI array operations documentation है।

+0

मुझे लगता है कि समस्या यह है कि मैं जेएनआई में बनाई गई गतिशील 2 डी फ्लोट सरणी को सी ++ विधि में कैसे ले जाऊंगा जो एक फ्लोट लेता है [] []। मुझे नहीं लगता कि यह संभव है। क्या यह? यदि हां, तो वाक्यविन्यास क्या होगा? –

+0

हां - यह संभव है। मेरा उदाहरण देखें स्थानीयअरे दो-आयामी, मूल सरणी के सूचक है। आप कैसे घोषणा करते हैं कि यह आपके ऊपर है। मेरा उदाहरण जावा से पारित डेटा के साथ इसे भरने के तरीके को दिखा रहा है। – zacheusz

+0

मैंने फ्लोट के आवंटन के साथ कोड अपडेट किया [] [] localArray (मैंने इसे संकलित नहीं किया)। – zacheusz

0

आबंटित स्मृति को रिहा आप कुछ इस तरह कर सकते हैं के लिए: एक को बदलने (जावा में) 2 डी जावा सरणी द्वारा

free(localArray); 
संबंधित मुद्दे