Я использую нативный код вызова из приложения 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;
}
Для решения проблемы просто превратить глобальные переменные в локальные переменные. Довольно просто Проблема в том, что как только DLL загружена в память, все глобальные переменные со значениями заполняются данными из последнего вызова. [предложено @doctorlove в комментариях].