2010-11-15 9 views
98

J'ai transmis une chaîne URL de Java au code C en tant que jstring type de données grâce à l'utilisation de JNI. Et ma méthode de bibliothèque a besoin d'un char * comme URL. Comment convertir jstring en char *?JNI convertir jstring en char *

P.S .: Y at-il un avantage à utiliser jcharArray en C? (Ie passage char [] au lieu de chaîne dans la méthode native)

Répondre

199

est ici aa quelques liens utiles que j'ai trouvé quand 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 cette

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

    // use your string 

    (*env)->ReleaseStringUTFChars(env, javaString, nativeString); 
} 
+1

est-il nécessaire de garder la constante 'nativeString' constante? – Prasham

+4

si vous vérifiez le second lien, le prototype de la fonction GetStringUTFChars est: const jbyte * GetStringUTFChars (JNIEnv * env, chaîne jstring, jboolean * isCopy); donc vous n'avez pas vraiment de choix –

+1

Merci, ça a marché. Je l'ai accepté comme réponse. Et je voulais vous donner +2 votes pour cela. Mais il semble que j'ai fait une erreur en cliquant deux fois sur la flèche vers le haut. Merci beaucoup quand même. – Prasham

37

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

Dans Android & & cpp devrait être ceci:

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

// use your string 

env->ReleaseStringUTFChars(javaString, nativeString); 

peut corriger cette erreur:

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

2.error: aucune fonction correspondante pour l'appel à' _JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool) »

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

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

+0

Cela m'a aidé avec l'erreur # 1! – Suzi

+0

Vous devez avoir (* env) -> au lieu de env-> – AlexanderNajafi