জেএনআই জাস্ট্রিংকে চরে রূপান্তর করছে *


113

আমি জাভা থেকে সি কোডে ইউআরএল স্ট্রিংটি jstringজেএনআই ব্যবহারের মাধ্যমে ডেটা টাইপ হিসাবে পাস করেছি। এবং আমার লাইব্রেরি পদ্ধতিতে char *ইউআরএল হিসাবে দরকার ।

আমি কিভাবে রূপান্তর করতে পারেন jstringমধ্যে char *?

পিএস: সি-তে jcharArray ব্যবহারের কোনও সুবিধা আছে কি? (যেমন char []দেশীয় পদ্ধতিতে স্ট্রিংয়ের পরিবর্তে পাসিং )


আপনি কি ডকুমেন্টেশনের সাথে পরামর্শ করার কথা বিবেচনা করেছেন?
লার্নের মারকুইস

উত্তর:


227

জেএনআই দিয়ে শুরু করার সময় আমি খুঁজে পেয়েছিলাম এমন বেশ কয়েকটি দরকারী লিঙ্ক

http://en.wikedia.org/wiki/Java_Native_Interface
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/function.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
আপনি যদি দ্বিতীয় লিঙ্কটি পরীক্ষা করেন তবে গেটস্ট্রিংএফসিএফআরস ফাংশনটির প্রোটোটাইপটি হ'ল: জেবিটি * গেটস্ট্রিংআউটফিসারস (জেএনআইইএনভি * এনভি, জাস্ট্রিং স্ট্রিং, জবুলিয়ান * ইসকপি); সুতরাং আপনার সত্যিই কোনও চয়েস নেই
জেসন রজার্স

1
আমি মনে করি এটি লক্ষণীয় যে এখানে কৌশলটি বর্ণিত হয়েছে (এবং উইকিপিডিয়া পৃষ্ঠায়) পরিবর্তিত ইউটিএফ -8 এনকোডিং ব্যবহার করেছে, যা সমস্ত পরিস্থিতিতে কাজ করতে পারে না। বিকাশকারী.অ্যান্ড্রয়েড.
com

1
ধন্যবাদ, সেই কাজ কিন্তু আকর্ষণীয়ভাবে কনস্টের চর * * * * * তে রূপান্তর করতে পারে না।
CoDe

1
প্রযুক্তিগতভাবে কোড, কিছু জাদুতে এটি হতে পারে তবে এটি সবচেয়ে ভাল এড়ানো যায়; এটি সম্ভবত constকোনও কারণে ঘোষণা করা হয়েছে। আপনার সমস্যার সঠিক প্রতিক্রিয়া হয় strcpyথেকে const char*একটি মধ্যে char*। এটি আপনাকে char*যে পরিবর্তন করতে পারে তা সরবরাহ করবে।
লুডুভিজক

51

প্রথম জেসন রজার্সের উত্তর ধন্যবাদ।

ইন অ্যান্ড্রয়েড && CPP এই হওয়া উচিত:

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

এই ত্রুটিগুলি ঠিক করতে পারে:

1. ত্রুটি: '->' এর বেস অপারেন্ডে নন-পয়েন্টার টাইপ রয়েছে 'জেএনআইইএনভি {ওরফে _জএনআইইএনভি}'

২. ত্রুটি: '_জেএনআইইএনভি :: গেটস্ট্রিংআউটএফসিআরস (জেএনআইইএনভি * এবং, _জাস্ট্রিং * এবং, বুল)' এর কল করার জন্য কোনও মিলবে না

৩. ত্রুটি: '_জেএনআইইএনভি :: রিলিজ স্ট্রিংআউটএফসি'র (জেএনআইইএনভি * এবং, _জাস্ট্রিং * &, চর কনস্ট * ও)' তে কল করার জন্য কোনও মিলবে না

4. অ্যাড করুন "env-> ডিলিটলোকালআরফ (নেটিস্ট্রিং)" শেষে।


আপনার এনভো -> এর পরিবর্তে (* এনভি) -> থাকা দরকার
আলেকজান্ডারনজাফি

2
আপনি কেবল তখনই প্রয়োজন (*env)->যদি আপনি সি ব্যবহার করেন, সি ++ ব্যবহার করেন না।
ছয়টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.