2012-04-24 13 views
9

पर जेएनआई के साथ सी और जावा के बीच एक जटिल संरचना को कैसे पास किया जाए मेरे पास मेरे एंड्रॉइड एप्लिकेशन पर सी कोड में एक जटिल strucutre है और मैं इसे जावा पक्ष में उपयोग करना चाहता हूं। मैंने Google और stackoverflow के साथ कुछ शोध किया है, इसलिए मैंने अपने सी strucutre से जावा क्लास बनाया है, लेकिन अब जावा में इसे कैसे प्राप्त करें।एंड्रॉइड एनडीके

मैं इन जानकारियां मिल गया है, कक्षा में एक सूचक बनाने और सी पक्ष पर इस का उपयोग के बारे में:

Get the field ID : (*env)->GetFieldID(...) 
Get the pointer : (*env)->GetLongField(...) 
Set the pointer : (*env)->SetLongField(...) 

लेकिन मुझे समझ नहीं आता कि कैसे यह वास्तव में काम करता है ...

ऊपर, आप अब तक जो कुछ भी कर चुके हैं वह पा सकते हैं ... इतना नहीं! सी तरफ:

ComplexStructure Java_com_main_MainActivity_listenUDP(JNIEnv* env, jclass clazz) 
{ 
    int i,taille; 
    ComplexStructure myStruct;  
    taille = -1;  
    taille = recvfrom(socket, &myStruct, sizeof(ComplexStructure), 0, &rcvAddr, &sizeOfSock); 
    if(taille != -1) 
    { 
     return myStruct; 
    } 
    return NULL; 
} 

और जावा की ओर:

public void getFromUDP() { 

    ComplexClass myClass = new ComplexClass(); 
    myClass = listenUDP();    
} 

@Override 
public void run() { 
    initUDP(); 
    getFromUDP(); 
} 


public static native ComplexClass listenUDP(); 
public static native void initUDP(); 
public static native void closeUDP(); 

/** Load jni .so on initialization */ 
static { 
    System.loadLibrary("native-interface"); 
} 

संपादित करें: मैं जोड़ने के लिए है कि मेरे संरचना इस तरह बहुत जटिल है चाहते हैं:

typedef struct{ 
    TYPE_A myStructA; 
    TYPE_B myStructB; 
    TYPE_C myStructC; 
    TYPE_D myStructD; 
}ComplexStructure; 

typedef struct{ 
    float rad; 
    int size; 
    bool isEmpty; 
}TYPE_A; 

typedef struct{ 
    float rad; 
    bool isEmpty; 
    float color; 
    int temp; 
}TYPE_B; 

typedef struct{ 
    int temp; 
    float rain; 
    bool isEmpty; 
}TYPE_C; 

typedef struct{ 
    float rad; 
    int idPerson; 
    bool isOnTime; 
}TYPE_D; 

इससे भी अधिक जटिल, यह दिखाने के लिए सिर्फ एक उदाहरण है कि यह कैसा है!

उत्तर

8

आप जावा में कच्चे सी structs पास नहीं कर सकते हैं और उम्मीद है कि यह इन structs कक्षाओं के रूप में इलाज करने की उम्मीद है। आपको अपनी संरचना के लिए कक्षा बनाने की जरूरत है। मैं देखता हूं कि आप पहले से ही ऐसा कर चुके हैं, इसलिए केवल एक चीज जो आपको करने की ज़रूरत है वह इस संरचना को कक्षा के उदाहरण में परिवर्तित करना है।

जावा तरफ कोड:

public static native ComplexClass listenUDP(); 

को अनुवाद कर देगा:

JNIEXPORT jobject JNICALL Java_com_main_MainActivity_listenUDP(JNIEnv *env, jclass); 

कि सी कोड में, आप env->FindClass(); समारोह का उपयोग कर ComplexClass लोड करने के लिए की जरूरत है। फिर उस वर्ग का एक नया उदाहरण बनाने के लिए (यदि आपके पास शून्य-पैरामीटर कन्स्ट्रक्टर है तो यह मामलों को सरल बनाता है), आपको env->NewObject() विधि में इसे एक कन्स्ट्रक्टर विधि हस्ताक्षर लोड करने और "Invoke" करने की आवश्यकता है। पूर्ण कोड:

jclass complexClass = env->FindClass("/com/main/ComplexClass"); 
jmethod constructor = env->GetMethodId(complexClass, "<init>", "()com/main/ComplexClass"); //The name of constructor method is "<init>" 
jobject instance = env->NewObject(complexClass, constructor); 

तो फिर तुम env->setXXXField(); का उपयोग कर इस वर्ग के क्षेत्र सेट करना होगा। यदि आपके पास फ़ील्ड के रूप में अधिक ऑब्जेक्ट हैं और उन्हें बनाना चाहते हैं, तो उपरोक्त प्रक्रिया को किसी अन्य ऑब्जेक्ट के लिए दोहराएं।

यह बहुत जटिल लग रहा है, लेकिन यह प्रबंधित जावा कोड में देशी सी का उपयोग करने की कीमत है।

+0

ठीक है, आपके उत्तर के लिए बहुत बहुत धन्यवाद, यह बहुत उपयोगी है। जैसा कि आप कहते हैं, यह बहुत जटिल है, मैंने सोचा था कि संरचना को कक्षा में आसानी से प्रतिलिपि बनाना संभव था, लेकिन ऐसा नहीं है ... क्योंकि मेरी संरचना में बहुत सारी वस्तुएं/फ़ील्ड हैं, इसलिए यदि मुझे मैन्युअल रूप से सभी पैरामीटर जोड़ना है, तो मैं इस पर दिन गुजरेंगे। तो, जावा में सीधे मेरे सी अनुप्रयोग से यूडीपी पैकेट प्राप्त करना सबसे आसान है ?? बहुत बहुत धन्यवाद @ जकूब ज़वेर्का – Bibu

+1

@ मार्टिन डेटाग्राम पर एक नज़र डालें: http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html –

+0

हाँ मुझे पता है कि डेटाग्राम सॉकेट और डेटाग्राम पैकेट का उपयोग कैसे करें, लेकिन मुझे नहीं पता कि मेरे डेटा वापस कैसे प्राप्त करें :), स्ट्रिंग के लिए यह काफी सरल है, लेकिन संरचना के लिए ... – Bibu

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