web-dev-qa-db-fra.com

passage d'un tableau de chaînes de Java vers C avec JNI

J'ai un tableau de chaînes comme {"myname","yourname","hisname"} et j'essaie d'envoyer ce tableau à C en utilisant JNI . Je n'ai pas pu trouver de solution claire à cela. J'ai essayé de prendre cette chaîne comme chararray mais sans succès.

Y a-t-il un moyen de faire cela?

30
masay

Vous pouvez écrire une fonction simple qui prend un objet jobjectArray, transtyper chacun en jstring puis appeler GetStringUTFChars dessus.

Comme ça:

void MyJNIFunction(JNIEnv *env, jobject object, jobjectArray stringArray) {

    int stringCount = env->GetArrayLength(stringArray);

    for (int i=0; i<stringCount; i++) {
        jstring string = (jstring) (env->GetObjectArrayElement(stringArray, i));
        const char *rawString = env->GetStringUTFChars(string, 0);
        // Don't forget to call `ReleaseStringUTFChars` when you're done.
    }
}
80
8ball

Oui, il existe un moyen. Vous passeriez le String[] Dans votre méthode native du côté Java et cela se retrouverait du côté C/C++ sous la forme d'un jobjectArray. Vous utilisez GetObjectArrayElement() pour obtenir un jstring à un index donné, puis utilisez GetStringUTFChars() ou GetStringChars() pour obtenir un pointeur C/C++ vers la chaîne sous-jacente Les données.

Et si vous ne le savez pas, le JNI Book est une référence précieuse.

9
QuantumMechanic

cela peut se faire de la manière suivante:

(JNIEnv *env, jobject object, jobjectArray prdctini)
    {
        const char *param[20];
        jsize stringCount = (*env).GetArrayLength(prdctini);

          for (int i=0; i<stringCount; i++) {
                  jstring string = (jstring) (*env).GetObjectArrayElement( prdctini, i);
                  param[i] = (*env).GetStringUTFChars( string, NULL);
          }
          cout<<"U_Id="<<param[0]<<endl;
          cout<<"aggregation="<<param[1]<<endl
}
1
govind

N'oubliez pas d'utiliser

env->GetArrayLength(stringArray);
0
Dawid Drozd