web-dev-qa-db-fra.com

Passer une chaîne de Java dans JNI

Je veux passer une chaîne dans le JNI que j'écris et qui doit être affectée à un const char *. Voici comment je l'ai fait:

JNI...(...,jstring jstr...){

const char* str = env->GetStringUTFChars(jstr,0);
env->ReleaseStringUTFChars(str,jstr,0);

}

Mais si je printf le caractère const * après avoir assigné à jstring ce que je vois est différent de celui que j’ai assigné à la valeur str directement dans JNI et printf à partir de là.

Est-ce la bonne façon de faire? Ou y a-t-il un autre moyen d'assigner une chaîne de Java à const char * dans JNI? 

19
perumal316

Code Java 

public static native double myMethod( String path);  

Code C

JNIEXPORT jdouble JNICALL Java_your_package_structure_className_myMethod
(JNIEnv * env, jobject jobj, jstring path) {
     char * path;

    path = (*env)->GetStringUTFChars( env, path , NULL ) ;
29
Jigar Joshi

Tout ce que vous faites est correct. Il existe un autre moyen, mais d'obtenir wchar_t au lieu de char:

const wchar_t * utf16 = (wchar_t *)env->GetStringChars(bytes, NULL);
size_t length = (size_t)env->GetStringLength(bytes);        
...
env->ReleaseStringChars(bytes, (jchar *)utf16);
2
Vladimir Ivanov

Comme #Jigar a expliqué:

JNIEXPORT jdouble JNICALL Java_your_package_structure_className_myMethod
(JNIEnv * env, jobject jobj, jstring jstr) {


    const char *path = (*env)->GetStringUTFChars( env, jstr , NULL ) ;

pour obtenir un jstring à partir de Java, il faut écrire la méthode c ++ comme ci-dessous

Code C++:

const char *path = env->GetStringUTFChars(jstr , NULL ) ;

UPDATE: Comme mentionné dans les commentaires, il y avait une erreur dans le code. C'est maintenant corrigé.

0
Davood Falahati
JNIEXPORT jstring JNICALL Java_Hello_sayHi(JNIEnv *env, jobject obj, jstring string) {
     const char *str = env->GetStringUTFChars(string, 0);
     printf("%s", str);
}
0
prem kumar

En fait, la solution est simple: le dernier paramètre de "GetStringUTFChars" est JNI_TRUE pour envoyer une copie. Puisque vous transmettez JNI_FALSE (0) et appelez "ReleaseStringUTFChars", vous détruisez la référence. Ce que vous voyez après le "relâchement" sont des octets aléatoires provenant d’ailleurs dans la mémoire de votre application.

L'appel de "GetStringUTFChars" avec JNI_TRUE ou la suppression de l'appel "ReleaseStringUTFChars" résoudra votre problème.

EDIT: Désolé de creuser un cimetière.

0
Eduardo Costa