Вызов Native (DLL) кода из Java с использованием JNI сохраняет переменные c ++ инициализированными при каждой новой функции отзыва

Я использую нативный код вызова из приложения Java (vr1.7) (как показано ниже) из графического интерфейса пользователя с Swing.

public class ImageProcessContainer {

static {
System.load("c:\\ImageProcDLL.dll");
}

native public int processImage(String filename, String args);

public int execute(String filename, String args){

return processImage(filename, args)

}
}

Когда я звоню в первый раз, код работает отлично. Со второго вызова до запуска кода, но переменные C продолжаются с данными из предыдущего сеанса!

Почему это происходит?

Переменные в коде C ++ не являются статичными! Фрагмент кода C ++ ниже. Глобальные переменные остаются инициализированными.

Например: переменные corner1 и corner2 (оба глобальные), некоторые из них продолжают инициализироваться

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <time.h>
//Some others includes

#include "ImageProc.h"
using namespace std;
using namespace cv;

Mat frameFeed;
Point corner1, corner2;
Rect box;

.
.
//some other globalsJNIEXPORT jint JNICALL _processImage (JNIEnv * env, jclass, jstring filename, jstring buffer){
return processVideo(NULL, NULL);
}

int processVideo(char * filename, char * buffer) {

namedWindow("Video Process");

//Initializing some local variables
int inc                 = 0;
ImageProc * imageproc = NULL;
.
.
//some code here

while(capture.read(frameFeed) && !terminateApp){
if (startImageProc) {
if (!imageproc) {
int securityArea = 10;
Point p1, p2;

p1.x = corner1.x;
p1.y = corner1.y;

p2.x = corner2.x;
p2.y = corner2.y;

imageproc = new ImageProc(1, box, p1, p2);
}
if (initParameters){
//Some code Here
initParameters = false;

} else {
imageproc->analiseMoment(frameFeed);
}
}
.
.
//some code here
return 1;

}

0

Решение

Для решения проблемы просто превратить глобальные переменные в локальные переменные. Довольно просто Проблема в том, что как только DLL загружена в память, все глобальные переменные со значениями заполняются данными из последнего вызова. [предложено @doctorlove в комментариях].

0

Другие решения


По вопросам рекламы [email protected]