web-dev-qa-db-ja.com

文字列配列をJavaからJNIを使​​用してCに渡す

{"myname","yourname","hisname"}のような文字列配列があり、[〜#〜] c [〜#〜][〜#〜] jniを使用してこの配列を送信しようとしています。 [〜#〜]。これに対する明確な解決策を見つけることができませんでした。この文字列をchararrayとして取得しようとしましたが、成功しませんでした。

これを行う方法はありますか?

30
masay

jobjectArrayオブジェクトを取得し、各オブジェクトをjstringにキャストして、そのオブジェクトに対してGetStringUTFCharsを呼び出す単純な関数を作成できます。

このような:

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

はい、方法があります。 _String[]_をJava側からネイティブメソッドに渡すと、それはjobjectArrayとしてC/C++側に伝わります。 GetObjectArrayElement()は特定のインデックスでjstringを取得し、GetStringUTFChars()またはGetStringChars()を使用して、基になる文字列データへのC/C++ポインターを取得します。

そして、あなたがそれについて知らないなら、 JNI Book は貴重な参考文献です。

9
QuantumMechanic

次の方法で実行できます。

(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

使用することを忘れないでください

env->GetArrayLength(stringArray);
0
Dawid Drozd