Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “线程中的异常”;“主要”;错误:JNA和OpenCV的内存访问无效_Java_C++_Opencv_Jna - Fatal编程技术网

Java “线程中的异常”;“主要”;错误:JNA和OpenCV的内存访问无效

Java “线程中的异常”;“主要”;错误:JNA和OpenCV的内存访问无效,java,c++,opencv,jna,Java,C++,Opencv,Jna,我有一份分为两部分的申请。其中一部分是用于OpenCV计算的C++程序。另一部分是Java部分。我用JNA控制相机,用OpenCV编辑相机中的图片。 我可以用JNA调用我的函数 我在C语言中的作用++ extern "C" __declspec(dllexport) int createScript(char* imagePath) 在这个函数中,我调用 void BladeCutter::calcMeanValues(cv::Mat image) { std::vector<c

我有一份分为两部分的申请。其中一部分是用于OpenCV计算的C++程序。另一部分是Java部分。我用JNA控制相机,用OpenCV编辑相机中的图片。 我可以用JNA调用我的函数

我在C语言中的作用++

extern "C" __declspec(dllexport) int createScript(char* imagePath)
在这个函数中,我调用

void BladeCutter::calcMeanValues(cv::Mat image)
{
    std::vector<cv::Mat> bgr_planes;
    cv::split(image, bgr_planes);
    cv::Scalar blue = cv::mean(bgr_planes[0]);
    cv::Scalar green = cv::mean(bgr_planes[1]);
    cv::Scalar red = cv::mean(bgr_planes[2]);
    meanValues.scalar = cv::Scalar(blue[0], green[0], red[0]);
    meanValues.brightness = calcBrightness(image);
}
BladeTileLocator是Java类

package de.test;

import com.sun.jna.Native;

import de.interfaces.IBladeTileLocator;

public class BladeTileLocator {

    public static void main(String[] args) {

        final byte[] ba = new byte[50];
        final IBladeTileLocator bladeTileLocator = (IBladeTileLocator) Native.loadLibrary("BladeTileLocator", IBladeTileLocator.class);
        final String path = "C:\\Users\\bak\\Pictures\\Bildanalyse\\Bild.JPG";
        bladeTileLocator.createScript(path);
    }
}
调用函数的我的JNA接口:

package de.interfaces;

import com.sun.jna.Library;

public interface IBladeTileLocator extends Library {
    int createScript(String imagePath);
}

我使用网站上的表格来了解我可以使用哪些类型。char*在jna字符串中。映射正确。您应该将注意力集中在JVM执行环境与C环境的不同之处。当您调用函数“而不使用JNA”时,您是将其作为共享库调用还是直接链接到代码?您可能无意中引用了某些未初始化的全局或静态。请尝试在
main
中引用字符串
path
的最后一行之后添加一行。在被调用者访问
字符串之前,一个激进的GC可能正在处理该字符串。在我的代码中,我进一步调用了许多opencv函数,如cv::imread、cv::findContours、cv::drawContours。我不知道为什么cv::split会引发这种异常。我明天发布我的全部代码。你可以关闭
jna.protected
,让JVM内核转储。这可能会为您提供一些本机堆栈,从而提供一些见解。
package de.interfaces;

import com.sun.jna.Library;

public interface IBladeTileLocator extends Library {
    int createScript(String imagePath);
}