2011-06-10 9 views
39

में कनवर्ट JNI प्रकार जबकि वहाँ एक देशी स्ट्रिंग (string nativeString = env->GetStringUTFChars(jStringVariable, NULL);) के लिए एक jstring मोड़ के बारे में प्रलेखन मैं एक उदाहरण है जो एक int करने के लिए एक एक booljint को jboolean या परिवर्तित कर देंगे नहीं मिल सकता है।मूल निवासी प्रकार

क्या कोई सुझाव दे सकता है कि यह कैसे प्राप्त किया जाता है?

उत्तर

42

आपको सी शैली के कास्ट का उपयोग करके jint से int पर कास्ट करने की आवश्यकता है। jboolean से bool (यदि आप C99 bool प्रकार का उपयोग कर रहे हैं) या uint8_t (यदि आप std int प्रकारों का उपयोग कर रहे हैं) या unsigned char पर समान हैं।

ओपन $NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h और आप jint, jboolean आदि देखेंगे typedef एस।

+7

आपका मतलब int intValue = (int) jIntValue है; ? – Graeme

+1

बिल्कुल, सी स्टाइल कास्ट नौकरी करेगा –

+0

आह .... शायद मुझे अपना प्रश्न अपडेट करना चाहिए ... – Graeme

2

http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp9502

कि आपके सवाल का जवाब देंगे।

+1

बिल्कुल मदद नहीं की। मैं समकक्षता को समझता हूं लेकिन सी/सी ++ की स्पष्ट समझ के बिना यह समझना मुश्किल है कि इसका मतलब है कि आप टाइपकास्ट कर सकते हैं। – Graeme

+10

यदि आपके करियर में आप केवल उन तकनीकों के साथ काम करने में कामयाब रहे हैं जो आप जानते हैं या उपयोग करने से पहले पूरी तरह से आत्मसात करने के लिए पर्याप्त समय है, तो आपके पास भाग्यशाली जीवन है।:) jboolean एक हस्ताक्षरित चार के लिए एक typedef है। मुझे नहीं पता कि इसे "बूल" डेटाटाइप के रूप में कैसे डाला जाए। (इसे बस (बूल) के साथ prefacing के रूप में देखकर काम नहीं करता है - मुझे इस सवाल पूछने के लिए अग्रणी)। – Graeme

+0

सी में, कोई भी पूर्णांक डेटाटाइप बूलियन के बराबर है। 0 मतलब झूठा है, और कुछ भी सच है। बिना हस्ताक्षर किए गए चार एक प्रकार का पूर्णांक है। जेएनआई केवल मामले में जेएनआई_एफएएलएसई और जेएनआई_TRUE (1 के बराबर) को परिभाषित करता है। –

21

कास्ट करने के लिए एक jboolean एक देशी bool को (जो केवल मूल्यों JNI_FALSE या JNI_TRUE हो सकती है) मैं कुछ इस तरह का प्रयोग करेंगे: jboolean JVM से नहीं आ रही है, तो शायद

(bool)(jboolean == JNI_TRUE) 

, तो jboolean != JNI_FALSE के लिए परीक्षण सुरक्षित माना जा सकता है।

+6

यह थोड़ा सीमित है। मुझे लगता है (बूल) (java_rtn! = JNI_FALSE) बेहतर है क्योंकि कुछ पुस्तकालय सच हो सकते हैं क्योंकि कुछ पूर्णांक 1 के बराबर नहीं हैं (और JNI_TRUE == 1)। – greg7gkb

+1

@ greg7gkb umm, whut ?! आप किस "लाइब्रेरी" के बारे में बात कर रहे हैं? जेवीएम को यह गारंटी देनी चाहिए कि जावा से सी तक पारित 'बूलियन' बिल्कुल 0 या 1. – Alnitak

+0

@Alnitak Windows API के अधिकांश फ़ंक्शन 0 में कोई त्रुटि होने पर 0 और 0 से भिन्न होने पर कोई भी VALUE 0 कार्य करता है। तो, एक फ़ंक्शन सफल हो सकता है और एक मान वापस कर सकता है, उदाहरण के लिए, 28 का, और इस उत्तर के कोड का उपयोग करके, इसे गलत में परिवर्तित कर दिया जाएगा। – BloodShura

1

अजीब एक बाहर jchar है। इसे unsigned short के रूप में परिभाषित किया गया है, और आपकी संकलन सेटिंग्स के आधार पर, यह wchar_t के बराबर हो सकता है या नहीं। आपके अंतर्निहित मंच के आधार पर, आप यूटीएफ 8 तारों के साथ काम करने से बेहतर हो सकते हैं। कम से कम वे अक्षर के ASCII सबसेट के लिए ASCII के बराबर हैं।

विंडोज और मैक ओएस/कोको पर, हालांकि, मूल चौड़ा स्ट्रिंग प्रतिनिधित्व बिल्कुल unsigned short है। जावा तार उसमें स्वाभाविक रूप से फिट बैठते हैं।

1

आप इसे अगर (..) बयान में उपयोग करना चाहते हैं, इस रूपांतरण के बिना मेरे लिए काम कर रहा है:

if (jboolean == true) { 
    return true; 
} else { 
    return false; 
} 
3

एक ही मुद्दा-तय की। मेरे मामले में मैं ओपनफ्रेमवर्क का उपयोग कर रहा हूं इसलिए मुझे नहीं पता कि यह गैर-ओपनफ्रेमवर्क परियोजनाओं पर लागू होता है (परीक्षण नहीं किया गया है)। हालांकि, ऐसा लगता है कि बाहरी कार्य में पहले दो तर्क हमेशा "env" और "thiz" होते हैं और इन्हें प्रत्येक नए बाहरी फ़ंक्शन के लिए स्पष्ट रूप से परिभाषित करने की आवश्यकता होती है।

extern "C"{ 

// casts the variable properly 
void Java_com_package_JavaClass_someFunction(JNIEnv* env, jobject thiz, jboolean yourBool){ 
    myTestApp->someFunction((bool) yourBool); 
} 

// "yourBool" will always be "1" because its taking the spot of "thiz" which is not null 
void Java_com_package_JavaClass_someFunction(JNIEnv* env, jboolean yourBool){ 
    myTestApp->someFunction((bool) yourBool); 
} 

// "yourBool" will always be "1" because its taking the spot of "env" which is not null 
void Java_com_package_JavaClass_someFunction(jboolean yourBool){ 
    myTestApp->someFunction((bool) yourBool); 
} 


}