2009-10-22 1 views
102

Я пытаюсь использовать андроид NDK.Как вернуть массив из JNI в Java?

Есть ли способ вернуть массив (в моем случае int[]), созданный в JNI на Java? Если да, пожалуйста, дайте быстрый пример функции JNI, которая сделает это.

-Спасибо

ответ

92

Если вы изучили документацию и все еще есть вопросы, которые должны быть частью вашего первоначального вопроса. В этом случае функция JNI в примере создает несколько массивов. Внешний массив состоит из массива «Объект», создающего функцию JNI NewObjectArray(). С точки зрения JNI, это все двухмерный массив, массив объектов, содержащий ряд других внутренних массивов.

Следующий цикл for создает внутренние массивы типа int [] с использованием функции JNI NewIntArray(). Если вы просто хотите вернуть один размерный массив из int, то функция NewIntArray() - это то, что вы использовали для создания возвращаемого значения. Если вы хотите создать одномерный массив строк, вы должны использовать функцию NewObjectArray(), но с другим параметром для класса.

Поскольку вы хотите вернуть целочисленный массив, то ваш код будет выглядеть примерно так:

JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size) 
{ 
jintArray result; 
result = (*env)->NewIntArray(env, size); 
if (result == NULL) { 
    return NULL; /* out of memory error thrown */ 
} 
int i; 
// fill a temp structure to use to populate the java int array 
jint fill[size]; 
for (i = 0; i < size; i++) { 
    fill[i] = 0; // put whatever logic you want to populate the values here. 
} 
// move from the temp structure to the java structure 
(*env)->SetIntArrayRegion(env, result, 0, size, fill); 
return result; 
} 
+0

Да, я сделал это уже. Мне не удалось понять пример, связанный с моей проблемой (последний), и мне было интересно, не подумает ли кто-нибудь объяснить более простой пример, просто вернув int []. – RyanCheu

+0

EDIT: Пожалуйста, проигнорируйте мой предыдущий комментарий, приведенный выше код действительно работает. Спасибо! Это было очень полезно. – RyanCheu

+3

EDIT2: Код работает, но вы должны изменить tmp в SetIntArrayRegion (...) для заполнения. – RyanCheu

30

если кто-то хотел бы знать, как вернуть String [] массив:

Java код

private native String[] data(); 

родной экспорт

JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject); 

нативный код

JNIEXPORT jobjectArray JNICALL 
       Java_example_data 
    (JNIEnv *env, jobject jobj){ 

    jobjectArray ret; 
    int i; 

    char *message[5]= {"first", 
         "second", 
         "third", 
         "fourth", 
         "fifth"}; 

    ret= (jobjectArray)env->NewObjectArray(5, 
     env->FindClass("java/lang/String"), 
     env->NewStringUTF("")); 

    for(i=0;i<5;i++) { 
     env->SetObjectArrayElement( 
     ret,i,env->NewStringUTF(message[i])); 
    } 
    return(ret); 
    } 

от ссылки: http://www.coderanch.com/t/326467/java/java/Returning-String-array-program-Java

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

  • Нет связанных вопросов^_^