Безопасная передача данных из функции Android JNI C ++ в класс Java - PullRequest
0 голосов
/ 28 марта 2012

Я программирую приложение для Android, попробуйте отключить сборщик мусора на некоторое время.

Моя программа вызывает функцию JNI C ++. Там некоторые данные вычисляются (извлекаются функции с помощью OpenCV) и упаковываются в примитивный массив. Каждый раз, если GC работает между выделением памяти и записью данных, программа завершается ошибкой. Это потому, что указатель на память устарел.

Вот пример кода:

jfloatArray result = (env)->NewFloatArray(data_size);
    if(result == NULL) return NULL;

    //2.2 getting working copy
    jboolean isCopy = false;
    jfloat* dst;
    dst = (jfloat*) env->GetPrimitiveArrayCritical(result, NULL);
    //dst = env->GetFloatArrayElements(result, NULL);

    if(dst == NULL) return (NULL);
    //2.3 working
    //Encoding - Description:
    //First line: |Key Indicator|Count KeyPoints|Something else|
    dst[0] = data.size();

    int dst_ptr = 0;
    for(int i = 1; i < data.size()-1; i++)
    {
        //Write data
    }

    //2.4 write data back
    env->ReleasePrimitiveArrayCritical(result, dst, JNI_COMMIT);

    //Release Copy
    env->ReleasePrimitiveArrayCritical(result, dst, JNI_ABORT);

Как видите, я использовал критический примитив, но иногда сборщик мусора работает в любом случае.

Мои вопросы:

  • как остановить сборку мусора на некоторое время (я знаю, это нормально невозможно)
  • как сделать так, чтобы ReleasePrimitiveArrayCritical делал то, что я хочу (android 2.3.3)
  • как я могу вызвать сборщик мусора в классе c ++ (возможно, gc потребуется немного времени для повторного запуска)
  • существует ли какой-то безопасный способ получения данных из класса jni c ++

спасибо за помощь

...