Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安卓JNI C++;函数到java类_Java_Android_Garbage Collection_Java Native Interface_Data Transfer - Fatal编程技术网

安卓JNI C++;函数到java类

安卓JNI C++;函数到java类,java,android,garbage-collection,java-native-interface,data-transfer,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 getti

我正在编写一个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);
jfloatArray结果=(env)->NewFloatArray(数据大小);
if(result==NULL)返回NULL;
//2.2获取工作副本
jboolean isCopy=false;
jfloat*dst;
dst=(jfloat*)env->GetPrimitiveArrayCritical(结果,NULL);
//dst=env->GetFloatArrayElements(结果,空);
if(dst==NULL)返回(NULL);
//2.3工作
//编码-说明:
//第一行:|关键指标|计算关键点|其他内容|
dst[0]=data.size();
int dst_ptr=0;
对于(int i=1;iReleasePrimitiveArrayCritical(结果、dst、JNI_提交);
//发布副本
env->ReleasePrimitiveArrayCritical(结果、dst、JNI_中止);
正如您所看到的,我使用了原语critical,但有时垃圾收集器仍会运行

我的问题是:

  • 如何在短时间内停止垃圾收集(我知道,这通常是不可能的)
  • 一个发布版PrimitiveArrayCritical如何满足我的需求(android 2.3.3)
  • 我如何调用C++类中的垃圾收集器(也许GC需要花费很少的时间再运行)
  • 是否有一些安全的方法从JNI C++类< /LI>获取数据?

谢谢大家的帮助

我非常怀疑你的问题是垃圾收集器。你是怎么诊断的?如果您开始使用
isCopy
,并且它是
JNI\u TRUE
,那么它就不能是垃圾收集器。另外,两个释放调用和一个调用替换为
mode=0
;谢谢你的帮助,但是现在,我正在使用OpenCV的java接口。我花了很多时间来解决JNI的问题。我认为是垃圾收集器,因为只有垃圾收集器在第一次执行和“写入数据”之间运行,程序才会失败。所以,谢谢大家!