安卓JNI C++;函数到java类
我正在编写一个Android应用程序,尝试关闭垃圾收集器几次安卓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
我的程序调用一个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)
- 是否有一些安全的方法从JNI C++类< /LI>获取数据?
谢谢大家的帮助我非常怀疑你的问题是垃圾收集器。你是怎么诊断的?如果您开始使用
isCopy
,并且它是JNI\u TRUE
,那么它就不能是垃圾收集器。另外,两个释放调用和一个调用替换为mode=0
;谢谢你的帮助,但是现在,我正在使用OpenCV的java接口。我花了很多时间来解决JNI的问题。我认为是垃圾收集器,因为只有垃圾收集器在第一次执行和“写入数据”之间运行,程序才会失败。所以,谢谢大家!