[JNI] SigSev in GetPrimitiveArrayCritical()

Status
Nicht offen für weitere Antworten.

Linuxhippy

Mitglied
Hallo,

Ich hab ein gröberes Problem mit JNI, ich rufe von java aus eine Funktion auf, welche den Aufruf (samt Parameter) eigentlich nur weiterleiten soll:

Code:
JNIEXPORT void JNICALL Java_sun_font_X11TextRenderer_doDrawGlyphList
    (JNIEnv *env, jobject xtr, 
     jlong dstData, jint totalGlyphs, jboolean usePositions,
                    jboolean subPixPos, jboolean rgbOrder, jint lcdContrast,
                    jfloat glyphListOrigX, jfloat glyphListOrigY,
                    jlongArray images, jfloatArray positions)
{
  AWTXRDrawGlyphList(env, xtr, dstData, totalGlyphs, usePositions,
                     subPixPos, rgbOrder, lcdContrast, glyphListOrigX,
                     glyphListOrigY, images, positions);
}

diese methode ruft dann folgende auf:

Code:
JNIEXPORT void AWTXRDrawGlyphList
    (JNIEnv *env, jobject self, 
     jlong dstData, jint numGlyphs, jboolean usePositions,
                    jboolean subPixPos, jboolean rgbOrder, jint lcdContrast,
                    jfloat glyphListOrigX, jfloat glyphListOrigY,
                    jlongArray imgArray, jfloatArray posArray)
{
    jlong *images;

    images = (jlong *) (*env)->GetPrimitiveArrayCritical(env, imgArray, NULL);  <<< ABSTURZ
}

Es ist also wirklich nur eine Weiterleitungsfunktion, das ganz hat hauptsächlich den Grund dass ich der DLL wo methode Java_sun_font_X11TextRenderer_doDrawGlyphList drinnen ist, keine Abhängigkeiten haben möchte welche AWTXRDrawGlyphList braucht (ist in einer anderen DLL).

Mein Problem ist nun, dass GetPrimitiveArrayCritical in Methode2 einfach abstürzt.
Kopiere ich den Array-Zugriff aber in Methode 1, und füre sie aus, gibts keinen Absturz.

Habt ihr eine idee an was es liegen könnte?
Übergebe ich den JNI-Enviroment-Pointer falsch, oder übergebe ich die Java-Objekt-Handles falsch an die aufgerufene Funktion?

Danke im Vorraus, Clemens
 
G

Gast

Gast
du hast es mit c++ zu tun. erstens könnte der parameter einfach auf gerümpel verweisen und zweitens auf irgendein gemüse, das nicht mit deinem cast kompatibel ist.

kurz gesagt: der cast ist gewagt; der ungeprüfte zugriff auf den pointer tödlich.

segmentation faults sind harte programmier fehler. prüf jeglichen input oder stirb.
 

Linuxhippy

Mitglied
ach wie hilfreich, aber durchgelesen hast du meinen post nicht wirklich, oder?

Dass der cast sowieso keinen absturz verursachen kann müsste dir als Profi eigentlich klar sein, stellt er in C++ doch nur synthatischer natur (und keine semantik) beinhaltet.
Dass der Array/JNI-Env pointer nicht ins nirvana zeigt, sollte eigentlich schon dadruch klar sein, dass der zugriff in der vater-funktion funktioniert.

Clemens
 

thE_29

Top Contributor
Ich versteh nicht ganz was Methode1 und Methode2 ist!

Desweiteren wie sieht der Fehler aus?
 

Linuxhippy

Mitglied
Methode 1 ist Java_sun_font_X11TextRenderer_doDrawGlyphList , Methode 2 ist AWTXRDrawGlyphList.

Wenn ich -Xcheck:jni aktiviere, sagt er mir dass imgArray kein gültiger array-pointer ist, der geht bei der Übergabe verloren ist in AWTXRDrawGlyphList dann NULL.
Ist übergabe per Wert nicht erlaubt mit jni-array-handles?
Wenn ich XCheckJNI nicht aktiviere, stürzt die JVM ab.

lg Clemens
 

Marco13

Top Contributor
Hm - warum das jetzt ein Problem sein sollte, weiß ich zwar nicht, aber du kannst vielleicht mal testweise(!!!) eine gloable Referenz auf das Objekt erstellen, bevor du es an die untergeordnete Funktion übergibst ( http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/functions.html#global_local ). Eigentlich wüßte ich nicht, warum das expilizit notwendig sein sollte, aber wer weiß schon, in was genau solche unscheinbaren Zeichenfolgen wie JNIEXPORT und JNICALL vom Preprocessor umgewandelt werden :roll: ... vielleicht geht die Referenz da irgendwo flöten .. müßte man sich (z.B. auf http://java.sun.com/docs/books/jni/html/refs.html ) nochmal genauer durchlesen....
 

Linuxhippy

Mitglied
Hallo,

Auch wenn ich das JNIEXPORT/JNICALL weglasse, hab ich das gleiche Problem :-/
Auch wenn die Referenz flöten gehen würde, würde sich doch ned der Wert des imgArray-array-handles verändern, das is ja doch nur ein Eintrag in einer ID->Adress tabelle, oder?

Ich glaube da muss irgendwas beim Übergeben schiefgehen, aber ich kann nicht erkennen was da dran falsch sein soll :-/

lg Clemens
 

thE_29

Top Contributor
Also wenn ich das richtig verstehe, rufst du von der ersten Funktion doDrawGlyphList die 2te Funktion auf und dort ist dein Array NULL?

Kannste mal ausgaben machen (printf oder cout mit dem Objekt, am besten printf("%ld", OBJEKT);
Das zeigt dir dann den Pointer (wenns wohinzeigt) oder nen Fehler ;)
 

Linuxhippy

Mitglied
Ja genau, ich rufe von der 1. die zweite auf. Die erste macht eigentlich nix anderes als auf die 2. zu springen.

ja genau das hab ich gemacht.
In der ersten Methode ist images ein gültiger Pointer mit einem Integerwert so irgendwie wie: -198928293
In der zweiten Methode ist images: 0.

Hmh, drum denk ich dass da bei der Übergabe was schiefgeht.

lg Clemens
 

Linuxhippy

Mitglied
puh, so wies aussieht bringen den compiler die jfloats durcheinander:

In Methode1: numGlpyhs:10, usePositions:0, subpixPos:0,
rgbOrder:0, lcdc:140, glypx:100.500000, glyphy:400.50000, Images:
-1376605792

In Methode2: numGlpyhs:10, usePositions:0, subpixPos:0, rgbOrder:0,
lcdc:140, glypx:-0.000000, glyphy:-0.000000, Images: -1376605792,
Positions:0

Bis zum glyphx-parameter stimmt alles, dann vertut er sich irgendwo mit einem offset oder einer Feldlänge :-/

lg Clemens
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben