[英]How to pass a pointer to a struct array to a function in java using JNA?
我需要将IplImage
数组的IplImage
( IplImage extends CvArray extends Structure implements cloneable
)传递给函数C中的本机代码如下:
cvCalcEigenObjects(
nTrainFaces,
(void*)faceImgArr,
(void*)eigenVectArr,
CV_EIGOBJ_NO_CALLBACK,
0,
0,
&calcLimit,
pAvgTrainImg,
eigenValMat->data.fl);
我尝试了这个:
cvCalcEigenObjects(
nTrainFaces,
faceImgArr[0].getPointer(),
eigenVectArr[0].getPointer(),
CV_EIGOBJ_NO_CALLBACK,
0,
null,
calcLimit,
pAvgTrainImg,
eigenValMat.data.getFloatArray(0, Pointer.SIZE));
但这没用。 Java中此函数的声明如下:
public static void cvCalcEigenObjects(int i,
Pointer pntr,
Pointer pntr1,
int i1,
int 2,
Pointer pntr2,
cxcore.CvTermCriteria ctc,
cxcore.IplImage ii,
FloatBuffer fb)
您的C原型还不太清楚,但是我会给您一些乍一看在JNA中不明显的东西,但这可能是您遇到麻烦的原因。
处理结构数组时,您需要执行以下操作:
// Syntax to get a new empty structure array (4 cells) to pass to a function
// which will populate it
MyStructureClass[] incomingStructArray = new MyStructureClass().toArray(4);
// Syntax to transform a standard java array to an array suitable
// to be passed to a C function
MyStructureClass[] standardJavaStructArray = ....
MyStructureClass[] outgoingStructArray = new MyStructureClass().toArray(standardJavaStructArray);
现在,如果您想知道为什么需要这样做(从Java的角度来看这完全是疯狂的),您需要记住您不是在编写Java代码,而是在编写C语言
实际上,标准的Java数组是void *,而标准的C数组是MyStructure *
如果MyStructure在内存中使用12个字节:
这就是为什么在使用JNA和结构数组时,您需要非常小心自己做的事情,因为结构数组与结构指针数组非常不同
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.