Я пытаюсь использовать андроид NDK.Как вернуть массив из JNI в Java?
Есть ли способ вернуть массив (в моем случае int[]
), созданный в JNI на Java? Если да, пожалуйста, дайте быстрый пример функции JNI, которая сделает это.
-Спасибо
Я пытаюсь использовать андроид NDK.Как вернуть массив из JNI в Java?
Есть ли способ вернуть массив (в моем случае int[]
), созданный в JNI на Java? Если да, пожалуйста, дайте быстрый пример функции JNI, которая сделает это.
-Спасибо
Если вы изучили документацию и все еще есть вопросы, которые должны быть частью вашего первоначального вопроса. В этом случае функция 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;
}
если кто-то хотел бы знать, как вернуть 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
Да, я сделал это уже. Мне не удалось понять пример, связанный с моей проблемой (последний), и мне было интересно, не подумает ли кто-нибудь объяснить более простой пример, просто вернув int []. – RyanCheu
EDIT: Пожалуйста, проигнорируйте мой предыдущий комментарий, приведенный выше код действительно работает. Спасибо! Это было очень полезно. – RyanCheu
EDIT2: Код работает, но вы должны изменить tmp в SetIntArrayRegion (...) для заполнения. – RyanCheu