Zitat von
Simon1988:
Wie siehts mit mehrdimensionalen Arrays aus?
Werden gleichermaßen geholt oder ?
Delphi-Quellcode:
// Aufruf der Methode
buffer := JIntArray(self.jvm.JniEnv.CallObjectMethod(instance, mid, []));
p := PIntegerArray(self.jvm.JniEnv.GetIntArrayElements(buffer, isCopy));
Ja, auch Mehrdimensionale Arrays liegen in C einfach nur am Stück im Speicher. Hier ist es allein die Interpretation für mehr als eine Dimension zuständig (letztlich ist auch der Speicher nur eindimensional). Bekannt dürfte dies Verhalten auch bei einer TBitmap und dem Befehl Scanline sein, man bekommt auch nur ein Zeiger auf das erste Element der gewählten Linie. Nimmt man die y Position 0, so zeigt dieser Zeiger auf ein Byte-Array, in dem die gesamten Bitmap-Daten (also ohne Metainfos) am Stück liegen.
Zitat von
Simon1988:
hm. 1. hab ich jetzt nen 2d array und kann einfach so aufrufen : p[0,1] ?
Jap, denke schon dass das geht (vorrausgesetzt die Dimensionen stimmen).
Zitat von
Simon1988:
2. Wie sähe denn die Signtur bei der Ermittlung der MethodenID aus ? einfach so ? : [I ?
Hm, jetzt für mehrdimensionale Arrays? Da bin ich mir nicht 100% sicher, müsste man ausprobieren. [ leitet ein Array vom entsprechenden Typ ein. Da Java hier durchaus den Unterschied zwischen int[] und int[][] kennt, ist das nun eine Frage. Wenn JNI intelligent handelt, klappt es!
[ADD]
Hm, bin mir eigentlich doch nicht so sicher. Ich meine in Java sind mehrdimensionale Arrays echte Arrays of Array. Das heißt natürlich, dass hier ein Array von Referenzen gespeichert wird. Das wiederum heißt, jedes Array hat eigene Eigenschaften (z.B. seine Länge). Der sichere Weg ist es hier einfach nur eindimensional auf Arrays zuzugreifen (z.B. angelehnt an die Scanline).
Hier siehst du wieder, warum ich schon sagte, dass man möglichst die primitiven Datentypen nehmen sollte. Es ist einfach der Unterschied komplett verschiedener Programmieransätze, der hier durch kommt. Wären die immer 100% kompatibel würde man sich schnell fragen ob man beide Sprachen braucht.
Jedenfalls kann es sein, dass du hier eine Art Adapter bemühen solltest, der einfach mehrdimensionale Arrays eindimensional zurückgeben kann.
[/ADD]