从Android JNI C ++函数到java Class的安全数据传输

时间:2012-03-28 08:24:21

标签: java android garbage-collection java-native-interface data-transfer

我正在编写一个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 ++类获取数据的安全方法

thx for all help

0 个答案:

没有答案