![](/img/trans.png)
[英]How to call a Java applet callback function from native C/C++ code using JNI.
[英]Call Native (DLL) code from Java using JNI keeps variables c++ initialized every new recall function
我正在從Java(vr1.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被加載到內存中,所有帶有值的全局變量就會被最后一次調用中的數據填充。 [在評論中被@doctorlove引用]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.