使用JNI调用java C++中的原生(DLL)代码,保持变量C++初始化每个新的回想函数

使用JNI调用java C++中的原生(DLL)代码,保持变量C++初始化每个新的回想函数,java,c++,swing,Java,C++,Swing,我使用的是来自JavaVR1.7应用程序的调用本机代码,如下所示,来自带有swing的GUI public class ImageProcessContainer { static { System.load("c:\\ImageProcDLL.dll"); } native public int processImage(String filename, String args); public int execute(String fil

我使用的是来自JavaVR1.7应用程序的调用本机代码,如下所示,来自带有swing的GUI

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 globals


JNIEXPORT 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加载到内存中,所有全局变量的值​​由上次调用的数据填充。[评论] @你需要显示C++侧的变量是如何的。在C++方面有一百万个错误可能发生,而不仅仅是静态的变量。给我们看看代码。我不是想让你生气,但我们仍然没有明显地接近这个问题。全局变量是潜在的bug,但问题只能在processVideo中识别。顺便说一句,无论您是否在Windows上,对包含行使用前斜杠!当您在代码运行之前的第二次调用中说,但是C变量继续使用上一次会话中的数据时!在哪个代码运行之前?你如何看待这些变量?因此,它加载dll,然后每次调用dll中的函数时,全局变量都具有相同的值。。。它不是每次调用函数时都重新加载dll,对吗?因此,您只需加载一次dll,调用初始化变量的函数,然后再次调用它,并想知道它们为什么有值?删除全局变量。