3

C++ ライブラリを使用する Android プロジェクトがあり、オブジェクト配列を C++ コードに送信する必要があります。

これは私の Java ネイティブ バインド コードです

class MyLib {
    public static native void testArray(String[] array);
}

これが私がそれを呼ぶ方法です

...
MyLib.testArray(new Object[20]);
...

そして、これは私の c++ jni コードです:

JNIEXPORT void JNICALL Java_com_android_mypackage_MyLib_testArray(JNIEnv * env, jobjectArray arr) {
    __android_log_print(ANDROID_LOG_INFO,"test","test array!!!!!!!!");
    int count = env->GetArrayLength(arr);
    __android_log_print(ANDROID_LOG_INFO,"test","array length %d", count);
     for (int i=0; i<count; i++) {
        __android_log_print(ANDROID_LOG_INFO,"test","--- get item %d", i);
        jstring jkey    = (jstring) env->GetObjectArrayElement(arr, i);
        __android_log_print(ANDROID_LOG_INFO,"test","item %d", i);    
        env->DeleteLocalRef(jkey);
    }
}

それを実行すると、logcat にこれが表示され、実行は sigsev 11 で終了します

JNI WARNING: jarray arg has wrong type (expected array, got Ljava/lang/Class;) in Lcom/android/mypackage/MyLib;.testArray:([Ljava/lang/Object;)V (GetArrayLength)

私の配列参照がクラス参照のように見える理由はありますか? オブジェクトのみで、ネイティブ型の配列には問題がありません。

4

1 に答える 1

5

私はあなたの関数署名を信じています

JNIEXPORT void JNICALL Java_com_android_mypackage_MyLib_testArray(JNIEnv * env, jobjectArray arr)

次のようになります。

JNIEXPORT void JNICALL Java_com_android_mypackage_MyLib_testArray(JNIEnv * env, jclass clazz, jobjectArray arr)

2 番目のパラメーターがありません。これは、静的メソッドでは常に Class オブジェクトです。

于 2013-09-12T18:38:24.273 に答える