使用JNI调用java C++中的原生(DLL)代码,保持变量C++初始化每个新的回想函数
我使用的是来自JavaVR1.7应用程序的调用本机代码,如下所示,来自带有swing的GUI使用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
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,调用初始化变量的函数,然后再次调用它,并想知道它们为什么有值?删除全局变量。