JNI convertissant jstring en char *

113

J'ai passé une chaîne d'URL du code Java au code C en tant que jstringtype de données via l'utilisation de JNI. Et ma méthode de bibliothèque a besoin d'un char *as url.

Comment puis - je convertir jstringen char *?

PS: Y a-t-il un avantage à utiliser jcharArray en C? (c'est-à-dire passer char []au lieu d'une chaîne dans la méthode native)

Prasham
la source
Avez-vous envisagé de consulter la documentation?
Marquis of Lorne

Réponses:

227

Voici quelques liens utiles que j'ai trouvés lorsque j'ai commencé avec JNI

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

concernant votre problème, vous pouvez utiliser ceci

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);
}
Jason Rogers
la source
1
est-il nécessaire de rester nativeStringconstant?
Prasham
5
si vous vérifiez le deuxième lien, le prototype de la fonction GetStringUTFChars est: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); donc vous n'avez pas vraiment le choix
Jason Rogers
1
Je pense qu'il vaut la peine de noter que la technique décrite ici (et sur la page Wikipédia) utilise un encodage UTF-8 modifié, qui peut ne pas fonctionner dans toutes les situations. Voir developer.android.com/guide/practices/…
cqcallaw
1
Merci, ce travail mais intéressant const char * ne peut pas convertir en char * :).
CoDe
1
@CoDe Techniquement, cela pourrait avec un peu de magie, mais il vaut mieux éviter cela; il est probablement déclaré constpour une raison. La bonne réponse à votre problème consiste à passer strcpydu const char*dans un fichier char*. Cela devrait vous fournir le mutable char*que vous voulez.
Loduwijk
51

Merci d'abord à la réponse de Jason Rogers.

Dans Android && cpp devrait être ceci:

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Peut corriger ces erreurs:

1. erreur: l'opérande de base de '->' a un type sans pointeur 'JNIEnv {aka _JNIEnv}'

2. erreur: pas de fonction correspondante pour l'appel à '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3. erreur: pas de fonction correspondante pour l'appel à '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4. ajouter "env-> DeleteLocalRef (nativeString);" à la fin.

kangear
la source
Vous devez avoir (* env) -> au lieu de env->
AlexanderNajafi
2
Vous n'en avez besoin que (*env)->si vous utilisez C, pas C ++.
sixones