JNIによるjstringからcharへの変換*


113

jstringJNIを使​​用して、データ型としてJavaからCコードにURL文字列を渡しました。そして、私のライブラリメソッドには、char *URL が必要です。

私はどのように変換することができますjstringではchar *

PS:CでjcharArrayを使用する利点はありますか?(つまりchar []、ネイティブメソッドで文字列の代わりに渡す)


ドキュメントの参照を検討しましたか?
ローン侯爵

回答:


227

ここに私がJNIを始めたときに見つけたいくつかの便利なリンクがあります

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一定に保つ必要がありますか?
Prasham、2010年

5
2番目のリンクを確認すると、関数GetStringUTFCharsのプロトタイプは次のようになります。const jbyte * GetStringUTFChars(JNIEnv * env、jstring string、jboolean * isCopy); 本当にチョイスはありません
ジェイソンロジャース

1
ここ(およびWikipediaのページ)で概説されている手法では、すべての状況で機能するとは限らない修正UTF-8エンコーディングを使用していることに注意してください。developer.android.com/guide/practices/…を
cqcallaw

1
おかげで、その作業が興味深いことにconst char *はchar *に変換できません。
CoDe

1
@CoDe技術的には、多少の魔法が必要かもしれませんが、それは避けるのが最善です。それはおそらくconst理由のために宣言されています。あなたの問題への正しい応答がにあるstrcpyからconst char*char*。これにより、必要な変更可能性が提供されますchar*
Loduwijk 2017年

51

最初にジェイソンロジャースの回答に感謝します。

ではAndroidの && CPPこれは次のようになります。

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

このエラーを修正できます:

1.エラー: '->'のベースオペランドに非ポインタタイプ 'JNIEnv {aka _JNIEnv}'があります

2.エラー: '_JNIEnv :: GetStringUTFChars(JNIEnv *&、_jstring *&、bool)'の呼び出しに対応する関数がありません

3.エラー: '_JNIEnv :: ReleaseStringUTFChars(JNIEnv *&、_jstring *&、char const *&)'の呼び出しに対応する関数がありません

4.「env-> DeleteLocalRef(nativeString);」を追加します 最後に。


env->の代わりに(* env)->が必要です
AlexanderNajafi

2
(*env)->C ++ではなくCを使用している場合にのみ必要です。
シクソン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.