我有两个部分的应用程序。一部分是用于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);
}
并在cv :: split获取无效的内存访问权限(image,bgr_planes); 如果我在没有jna的情况下调用程序,程序运行正常。
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokePointer(Native Method)
at com.sun.jna.Function.invokePointer(Function.java:477)
at com.sun.jna.Function.invokeString(Function.java:658)
at com.sun.jna.Function.invoke(Function.java:402)
at com.sun.jna.Function.invoke(Function.java:323)
at com.sun.jna.Library$Handler.invoke(Library.java:236)
at com.sun.proxy.$Proxy0.createScript(Unknown Source)
at de.test.BladeTileLocator.main(BladeTileLocator.java:14)
BladeTileLocator是Java-Class。
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);
}