JNI में परिवर्तित jstring को चार *


113

मैंने jstringJNI के उपयोग के माध्यम से डेटा प्रकार के रूप में जावा से सी कोड के लिए एक URL स्ट्रिंग पारित किया है । और मेरे पुस्तकालय के तरीके को एक char *url की आवश्यकता है ।

मैं कैसे परिवर्तित कर सकते हैं jstringमें char *?

पुनश्च: सी में jcharArray का उपयोग करने का कोई फायदा है? ( char []मूल विधि में स्ट्रिंग के बजाय पासिंग )


क्या आपने प्रलेखन से परामर्श करने पर विचार किया है?
लोर्ने

जवाबों:


227

यहां एक जोड़ी उपयोगी लिंक है जो मुझे तब मिला जब मैंने जेएनआई के साथ शुरुआत की

http://en.wikipedia.org/wiki/Java_Native_Interface
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

अपनी समस्या के विषय में आप इसका उपयोग कर सकते हैं

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)   
{
   const char *nativeString = env->GetStringUTFChars(javaString, 0);

   // use your string

   env->ReleaseStringUTFChars(javaString, nativeString);
}

1
क्या nativeStringनिरंतर रखना आवश्यक है ?
प्रणाम

5
यदि आप दूसरे लिंक की जांच करते हैं, तो फ़ंक्शन का प्रोटोटाइप GetStringUTFChars है: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * .Copy); तो आपके पास वास्तव में कोई विकल्प नहीं है
जेसन रोजर्स

1
मुझे लगता है कि यह ध्यान देने योग्य है कि यहां (और विकिपीडिया पृष्ठ पर) तकनीक संशोधित यूटीएफ -8 एन्कोडिंग का उपयोग करती है, जो सभी स्थितियों में काम नहीं कर सकती है। डेवलपर
.android.com

1
धन्यवाद, वह काम लेकिन दिलचस्प रूप से const char * char * :) में परिवर्तित नहीं हो सकता।
CoDe

1
@CoDe तकनीकी रूप से, यह कुछ जादू के साथ कर सकता है, लेकिन इससे सबसे अच्छा बचा जाता है; यह संभवतः constएक कारण के लिए घोषित किया गया है। आपकी समस्या का सही जवाब है strcpyसे const char*एक में char*char*जो आपको मनचाहा वर प्रदान करना चाहिए ।
लादुविज्क

51

धन्यवाद जेसन रोजर्स का जवाब पहले।

में एंड्रॉयड && सीपीपी इस होना चाहिए:

const char *nativeString = env->GetStringUTFChars(javaString, nullptr);

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

इस त्रुटियों को ठीक कर सकते हैं:

1.error: '->' का आधार संचालक गैर-पॉइंटर प्रकार 'JNIEnv {aka _JNIEnv}' है

2.error: '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)' को कॉल करने के लिए कोई मेल नहीं खाता।

3.error: '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)' पर कॉल करने के लिए कोई मेल नहीं खाता।

4.add "env-> DeleteLocalRef (nativeString);" अंत में।


आपको env-> के बजाय (* env) -> की आवश्यकता है
अलेक्जेंडरनजफी

2
आपको केवल तभी (*env)->उपयोग करना होगा जब आप C का उपयोग कर रहे हों, C ++ का नहीं।
छ:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.