Я программирую приложение для 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 ++
спасибо за помощь