gpt4 book ai didi

java - 如何使用 JNA 将指向结构体数组的指针传递给 java 中的函数?

转载 作者:行者123 更新时间:2023-12-01 15:58:11 25 4
gpt4 key购买 nike

我需要传递IplImage数组的指针(IplImage extends CvArray extends Structure Implements cloneable) 为函数 C 中的 native 代码如下:

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 原型(prototype)相当不清楚,但我会给你一些在 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 字节:

  • MyStructureClass 的 4 单元 Java 数组在内存中使用 16 字节(= 4 单元 x 4 字节/指针)(不完全正确,但可以这么说;如果所有单元 != null,则额外的 48 字节将用于MyStructureClass 本身)
  • MyStructure 的 4 单元 C 数组使用 48 字节(= 每个 MyStructure 4 单元 x 12 字节)

这就是为什么在使用 JNA 和结构数组时需要非常小心,因为结构数组与指向结构的指针数组非常不同

关于java - 如何使用 JNA 将指向结构体数组的指针传递给 java 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4615478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com