簡體   English   中英

使用JNI從Java調用本機(DLL)代碼使變量c ++初始化每個新的回調函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM