2011-01-06 9 views
0

Ich brauche Zeiger eines Arrays von den nativen Code in C zu einer Funktion IplImage (IplImage extends CvArray extends Structure implements cloneable) übergeben wird, wie folgt:Wie übergeben Sie einen Zeiger auf ein Struct-Array zu einer Funktion in Java mit JNA?

cvCalcEigenObjects(
    nTrainFaces, 
    (void*)faceImgArr, 
    (void*)eigenVectArr, 
    CV_EIGOBJ_NO_CALLBACK, 
    0, 
    0, 
    &calcLimit, 
    pAvgTrainImg, 
    eigenValMat->data.fl); 

I dies versucht:

cvCalcEigenObjects(
    nTrainFaces, 
    faceImgArr[0].getPointer(), 
    eigenVectArr[0].getPointer(), 
    CV_EIGOBJ_NO_CALLBACK, 
    0, 
       null, 
    calcLimit, 
    pAvgTrainImg, 
    eigenValMat.data.getFloatArray(0, Pointer.SIZE)); 

aber es didn‘ t arbeiten. Die Erklärung dieser Funktion in Java ist wie folgt:

public static void cvCalcEigenObjects(int i, 
    Pointer pntr, 
    Pointer pntr1, 
    int i1, 
    int 2, 
    Pointer pntr2, 
    cxcore.CvTermCriteria ctc, 
    cxcore.IplImage ii, 
    FloatBuffer fb) 
+0

Was meinst du, es hat nicht funktioniert? Es würde nicht kompilieren? Beachten Sie, dass Ihr Argument 'int 2' in der Java-Spezifikation ungültig ist ... –

Antwort

1

Ihr C Prototyp ziemlich unklar ist, aber ich werde Ihnen etwas geben, das auf den ersten Blick in JNA nicht offensichtlich ist, aber das könnte die Ursache Ihrer Probleme sein.


Wenn mit Array von Strukturen zu tun benötigen Sie so etwas wie diesen tun:

// 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); 

Nun, wenn Sie sich fragen, warum man so tun müssen, würde (die von der Java-Sicht völlig verrückt ist) benötigen Sie Ihnen nicht Codierung Java zu erinnern, sind Sie C

ein Standard-Java-Array in der Tat * eine Lücke ist Codierung aber ein Standard-C-Array ist eine Meinestruktur *

Wenn MyStr UKTUR verwendet 12 Bytes im Speicher:

  • ein 4-Zellen-Array von Java MyStructureClass verwendet 16 Bytes (= 4 x 4 Bytes Zelle pro Zeiger) im Speicher (nicht ganz richtig, aber sagen wir mal so; wenn alle Zellen! = null dann zusätzliche 48 Bytes für die MyStructureClass selbst)
  • ein 4-Zellen-C-Array von Meinestruktur verwendet 48 Bytes (= 4 Zelle x 12 Bytes pro Meinestruktur)

verwendet werden, deshalb, Wenn Sie JNA und Array von Strukturen verwenden, müssen Sie sehr vorsichtig mit dem sein, was Sie tun, weil ein Array von Struktur sehr unterschiedlich zu einem Array von Zeigern zu Struktur ist

Verwandte Themen