我試圖使用JNI代碼在我的Android apps.I頻繁調用的本地mehod其返回jfloatArray:ReferenceTable溢出(最大值= 1024)
JNIEXPORT jfloatArray JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_DetectionBasedTracker_getvaluenative
(JNIEnv *env, jclass, jlong thiz,jfloatArray feature)
{ // these are my variables
CvMat* cameraMat = cvCreateMat(3,3,CV_32F);
CvMat* distMat =cvCreateMat(4,1,CV_32F);
jfloat* flt1 = env->GetFloatArrayElements(feature,0);
CvMat* imageMat = cvCreateMat(5,2,CV_32F);
CvMat* objMat = cvCreateMat(5,3,CV_32F);
CvMat* vec1 = cvCreateMat(1,3,CV_32F);
CvMat* vec2 = cvCreateMat(1,3,CV_32F);
Mat rotM ;
Mat m(vec1);
Mat t(vec2);
Mat rotM1 = rotM.t();
CvMat n = rotM1;
CvMat translat= t;
jfloatArray resultArray = env->NewFloatArray(12);
float matrice[12];
env->SetFloatArrayRegion(resultArray, 0,12 ,matrice);
操縱這些變量我釋放了他們這樣的後:
cvReleaseMat(&vec1);
cvReleaseMat(&vec2);
cvReleaseMat(&distMat);
cvReleaseMat(&cameraMat);
cvReleaseMat(&imageMat);
cvReleaseMat(&objMat);
rotM.release();
rotM1.release();
m.release();
t.release();
env->ReleaseFloatArrayElements(feature, flt1, 0);
env->DeleteLocalRef(feature);
return resultArray;
}
我的應用程序崩潰,我有這個在我的logcat:
05-02 13:41:03.179: W/dalvikvm(11288): ReferenceTable overflow (max=1024)
05-02 13:41:03.179: W/dalvikvm(11288): JNI pinned array reference table (0x32e248) dump:
05-02 13:41:03.179: W/dalvikvm(11288): Last 10 entries (of 1024):
05-02 13:41:03.179: W/dalvikvm(11288): 1023: 0x4105ad68 float[] (10 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1022: 0x4106d220 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1021: 0x41071db0 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1020: 0x4106d610 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1019: 0x4106d508 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1018: 0x4106efb0 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1017: 0x41072698 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1016: 0x410870c8 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1015: 0x4106cb88 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1014: 0x41087268 float[] (12 elements)
05-02 13:41:03.179: W/dalvikvm(11288): Summary:
05-02 13:41:03.179: W/dalvikvm(11288): 1 of float[] (10 elements)
05-02 13:41:03.179: W/dalvikvm(11288): 1023 of float[] (12 elements) (1023 unique instances)
05-02 13:41:03.179: E/dalvikvm(11288): Failed adding to JNI pinned array ref table (1024 entries)
任何想法,爲什麼鄰verflow正在發生?我究竟做錯了什麼?
你對返回的浮點數組做什麼?你是否在Java代碼中保留對它們的引用? – msam 2013-05-03 14:21:20
我使用它另一種本地方法:** jclass javaClass = env-> GetObjectClass(activityObj); \t \t \t jmethodID method = env-> GetMethodID(javaClass,「calculate」,「()[F」); \t \t \t jfloatArray imageArray =(jfloatArray)env-> CallObjectMethod(activityObj,method); \t \t \t LOG(「return from function calculate」); param =(env-> GetFloatArrayElements(imageArray,0)); **然後我釋放它:** env-> DeleteLocalRef(imageArray); ** – 2013-05-03 14:40:37