Java “线程中的异常”;“主要”;错误:JNA和OpenCV的内存访问无效
我有一份分为两部分的申请。其中一部分是用于OpenCV计算的C++程序。另一部分是Java部分。我用JNA控制相机,用OpenCV编辑相机中的图片。 我可以用JNA调用我的函数 我在C语言中的作用++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
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);
}