2012-06-27 8 views
14

से enum वापस जाने के लिए जावा में मेरे पास है:कैसे JNI

public class MyClass{ 

    public enum STATUS { 
     ZERO, 
     ONE , 
     TWO 
    } 

    public native STATUS nativeGetStatus(); 

    ... 

    private STATUS state = nativeGetStatus(); //returns enum 
    private STATUS state2 = nativeGetStatus(); //returns enum 

} 

मैं देशी विधि 'nativeGetStatus' चाहते हैं तो इस enum मान देने के लिए।

जेएनआई पूर्णांक लौटा रहा है और जावा में enum के मूल्य की तुलना करना एक विकल्प है, लेकिन क्या सोच रहा था कि यह नौकरी के माध्यम से मूल्य वापस करना और इसे सीधे राज्य में असाइन करना संभव है? अगर हाँ कैसे?

उत्तर

3

बेशक, आप इसे कर सकते हैं। एनम मूल्य एनम कक्षा के सार्वजनिक स्थैतिक क्षेत्र हैं, इसलिए आप कोड लिखने के लिए this आधिकारिक मैनुअल का उपयोग कर सकते हैं। बस जेएनआई से क्षेत्र प्राप्त करें और इसे नौकरी के रूप में वापस कर दें।

+0

आप क्षेत्र 'राज्य' का उपयोग और jobject के रूप में इसे वापस ओर इशारा करते हैं: तो यहाँ JNI कार्यान्वयन कि इसके बाद के संस्करण (परीक्षण नहीं) उदाहरण के साथ काम करना चाहिए है? खेद है कि मैंने अपनी मूल पोस्ट में उल्लेख करना याद किया कि एक से अधिक फ़ील्ड हो सकते हैं जिन्हें देशीGetStatus का रिटर्न वैल्यू सौंपा जाएगा। इस मामले में "बस जेएनआई से क्षेत्र प्राप्त करें और इसे नौकरी के रूप में वापस करें" शायद – krt

+0

काम नहीं कर सकता है, मेरा मतलब है कि एक कक्षा स्थिति का एक स्थिर क्षेत्र है। आप इसे एक्सेस कर सकते हैं और जेएनआई से वापस आ सकते हैं। –

+33

[यही कारण है कि आपको कभी भी एक उत्तर के रूप में लिंक प्रदान नहीं करना चाहिए] (http://25.media.tumblr.com/d10e5fba3bfbe874fbda2fcd8c2c2415/tumblr_mkvzqac3YX1r55vh6o1_1280.png)। – namuol

-2

ईएनएम जावा में एक प्राचीन डेटाटाइप नहीं है और इसका जावा विशिष्ट है। जावा डेटा प्रकार का विशिष्ट सेट है जिसे मूल कोड में मैप किया जा सकता है। सभी समर्थित प्रकारों के लिए this link देखें।

अपने मामले के लिए, आप की जरूरत देशी विधि लपेट एक और तरीका है जो डेटा देशी विधि से एक जावा Enum को लौट अनुवाद करेगा में।

+0

के लिए या जेएनआई विधि में मैपिंग करें। – EJP

+0

@EJP क्या आप कृपया उस पर विस्तृत जानकारी दे सकते हैं? – Santosh

+0

@EJP जेएनआई में फिर से enum घोषित करें? – krt

35

मैंने स्वीकार्य उत्तर से संघर्ष किया क्योंकि मैं थोड़ी देर के लिए स्थैतिक क्षेत्र के हस्ताक्षर को समझ नहीं पाया।

jclass clSTATUS = env->FindClass("MyClass$STATUS"); 
jfieldID fidONE = env->GetStaticFieldID(clSTATUS , "ONE", "LMyClass$STATUS;"); 
jobject STATUS_ONE = env->GetStaticObjectField(clSTATUS, fidONE); 

return STATUS_ONE; 
+0

मेरे पास एक कक्षा है जिसमें एक आंतरिक एनम है और इस उदाहरण ने मुझे 'एल क्लास $ InternalEnum' के साथ एनम प्रकार की वस्तु निर्दिष्ट करने में मदद की। आपका बहुत बहुत धन्यवाद! – mpellegr

+0

धन्यवाद! इस जवाब ने मेरी मदद की। नोट करें कि जावा और जेएनआई के साथ कौन बहुत familar नहीं है: आपको FindClass और GetStaticFieldID में क्लास पैकेज को इसके नाम के भीतर निर्दिष्ट करना होगा, उदाहरण के लिए "com/example/MyClass $ स्थिति"। – Vlad

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

  • कोई संबंधित समस्या नहीं^_^