2013-05-03 91 views
1

我試圖使用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正在發生?我究竟做錯了什麼?

+0

你對返回的浮點數組做什麼?你是否在Java代碼中保留對它們的引用? – msam 2013-05-03 14:21:20

+0

我使用它另一種本地方法:** 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

回答

2

如果您保留對返回浮點數組的引用,它們將不會被刪除,並且您將達到JNI本地引用的限制。

從您的其他方法的意見:

param= (env->GetFloatArrayElements(imageArray,0)); 
then i have release it : env->DeleteLocalRef(imageArray); 

你必須使用ReleaseFloatArrayElementsDeleteLocalRef釋放PARAM:

env->ReleaseFloatArrayElements(imageArray, param, 0); 

此外,除非你也正在做一些處理在Java中你應該只在你的本地代碼中執行所有的處理而不需要從Java到Native Code之間來回切換。在您的設計中,您似乎創建並使用本機代碼填充數組,然後將其返回給Java,以便將其傳回給另一本機方法。除非這樣做有很好的理由,否則您可以在本機代碼中完成所有必需的處理,然後返回結果。

+0

是的ReleaseFloatArrayElements,這正是我忘記做的。謝謝 – 2013-05-03 15:10:12