JNI konvertiert jstring in char *


113

Ich habe eine URL-Zeichenfolge von Java an C-Code als jstringDatentyp mithilfe von JNI übergeben. Und meine Bibliotheksmethode benötigt eine char *as url.

Wie kann ich konvertieren jstringin char *?

PS: Gibt es einen Vorteil bei der Verwendung von jcharArray in C? (dh Übergeben char []anstelle von Zeichenfolge in der nativen Methode)


Haben Sie darüber nachgedacht, die Dokumentation zu konsultieren?
Marquis von Lorne

Antworten:


227

Hier sind einige nützliche Links, die ich gefunden habe, als ich mit JNI angefangen habe

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

In Bezug auf Ihr Problem können Sie dies verwenden

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
ist es notwendig, nativeStringkonstant zu bleiben ?
Prasham

5
Wenn Sie den zweiten Link überprüfen, lautet der Prototyp der Funktion GetStringUTFChars: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); Sie haben also nicht wirklich eine Wahl
Jason Rogers

1
Ich denke, es ist erwähnenswert, dass die hier (und auf der Wikipedia-Seite) beschriebene Technik eine modifizierte UTF-8-Codierung verwendet, die möglicherweise nicht in allen Situationen funktioniert. Siehe developer.android.com/guide/practices/…
cqcallaw

1
Danke, das funktioniert aber interessanterweise kann const char * nicht in char * konvertiert werden :).
CoDe

1
@CoDe Technisch könnte es mit etwas Magie sein, aber das wird am besten vermieden; es wird wahrscheinlich constaus einem Grund deklariert . Die richtige Antwort auf Ihr Problem ist strcpyvon der const char*in eine char*. Das sollte Ihnen das Veränderliche bieten, das char*Sie wollen.
Loduwijk

51

Danke zuerst an Jason Rogers 'Antwort.

In Android && cpp sollte dies sein:

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Kann diese Fehler beheben:

1. Fehler: Der Basisoperand von '->' hat den Nichtzeigertyp 'JNIEnv {aka _JNIEnv}'.

2. Fehler: Keine übereinstimmende Funktion für den Aufruf von '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3. Fehler: Keine übereinstimmende Funktion für den Aufruf von '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4.add "env-> DeleteLocalRef (nativeString);" am Ende.


Sie müssen (* env) -> anstelle von env->
AlexanderNajafi

2
Sie benötigen nur, (*env)->wenn Sie C verwenden, nicht C ++.
Sixones
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.