2013-09-12 2 views
3

У меня есть проект андроида, который использует библиотеку C++, и мне нужно отправить массив объектов в код C++.JNI массив объектов доступа от ошибки 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 показывает это, и исполнение заканчивается сигшевым 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) 

Любые идеи, почему моя ссылка на массив является ссылкой на класс? У меня нет проблем с массивами родных типов, только с объектами.

ответ

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) 

Вы пропустили второй параметр - который в статических методов всегда является объектом класса.

Смежные вопросы