Как вернуть массив из JNI в Java?

Я пытаюсь использовать android NDK.

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

-спасибо

3 ответов


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

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

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

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[] array:

код 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


простым решением является запись данных массива в файл из C, а затем доступ к файлу из Java