2016-04-11 8 views
0

Der Aufruf von Methoden zum Abrufen oder Festlegen stürzt ab. Objekt-Array ist gültig. Es druckt bis Linie 2. In der Regel wurde Fehler beim Einfügen in das jobjectArray bekommen. Auch versucht, mit dem Wert von Jobject. Beide Getter und Setter scheitern.Das Aufrufen von Java-Methoden von JNI führt zum Absturz des Programms.

JNICode ist wie folgt:

JNIEXPORT jint JNICALL Java_demo_JNIWrapper_pax_1store_1get_1data_1avail_1info 
    (JNIEnv *env, jclass jclass1, jobjectArray jobj) 

{ 

..... 
..... 

    int len = (*env)->GetArrayLength(env, jobj); 

    printf ("Incoming object array length = %d\n", len);// - - - > Works.. shows 2 (I am passing 2 objects) 

    jobject j = (*env)->GetObjectArrayElement(env, jobj,0); 
     printf("This line 1 \n "); 
     jmethodID meth1=(*env)->GetMethodID(env,jclass1,"getTimestamp","()Ljava/lang/String;"); 
printf("This line 2 \n "); // - - - - > Works.. 

     jstring string_from_obj = (*env)->CallObjectMethod(env,j,meth1); // - - - - > Crashes.. 
printf("This line 3 \n "); // - - -> does not print this.. 
     printf("Contents are =%s\n",(*env)->GetStringUTFChars(env, string_from_obj, 0)); 

............ 

}  

Mein Java-Objekt ist als unten an:

public class DataAvailable { 
String timestamp; 
public String getTimestamp() { 
    return timestamp; 
} 
public void setTimestamp(String timestamp) { 
    this.timestamp = timestamp; 
} 
} 

Anruf zu JNI ist wie folgt:

public native int pax_store_get_data_avail_info(DataAvailable[] stats_array); 
+1

Haben Sie überlegt, Ihrem Code eine Fehlerprüfung hinzuzufügen? Sie müssen * jede * JNI-Methode auf einen ungültigen Rückgabewert überprüfen und die entsprechenden Maßnahmen ergreifen, nicht nur davon ausgehen, dass sie erfolgreich waren. Was war in diesem Fall der Wert der Methoden-ID? – EJP

+0

Auf den ersten Blick ist 'jclass1' nicht ** DataAvailable **, sondern ** demo.JNIWrapper **. –

+1

Mit Nachdruck was @EJP gefragt hat, welchen Wert hat 'jobject j'? Es ist durchaus möglich, dass ein Objekt-Array "null" -Elemente hat und ein einfaches "printf" ("Dies ist Zeile 2 \ n") ausgibt; "sagt nichts über den Erfolg oder das Versagen eines vorherigen Codes - es lässt Sie einfach wissen Der vorherige Code ** ist nicht abgestürzt **, nicht dass er richtig funktioniert hat. Außerdem ist 'printf()' zu 'stdout' problematisch, da es * gepuffert * ist. Wenn Sie die Ausgabe nicht sehen, bedeutet das nicht unbedingt, dass die Zeile nicht erreicht wurde - es bedeutet nur, dass sie nicht ausgegeben wurde. Wenn der Prozess abstürzt, bevor der Puffer geleert wird, wird die Ausgabe nicht angezeigt. –

Antwort

1

Die eklatante Problem ist Das pax_store_get_data_avail_info() ist keine Methode von DataAvailable. Es ist eine Methode einer anderen Klasse? Du sagst nicht, was es ist. Aber nehmen wir an, es ist:

class X { 
    public native int pax_store_get_data_avail_info(DataAvailable[] stats_array); 
} 

Wenn Sie diese Methode aufrufen, die jclass jclass1 Argument Sie erhalten, ist für „X“, nicht für DataAvailable. Daher schlägt Ihr Aufruf von GetMethodID() wahrscheinlich fehl. Sie überprüfen die Rückgabe nicht, daher geben Sie wahrscheinlich eine falsche Methoden-ID an den nächsten Anruf weiter. JNI-Fehler sind harte Abstürze und sehr hässlich.

Sie müssen die Jclass für DataAvailable abfragen und diese verwenden.

+0

Wie bekomme ich das Array von Objekten in meinem C-Code. Ist es möglich, den Objekttyp von Jobjarray zu bekommen. –

+0

Ja, Sie können '(* env) -> GetObjectClass (env, (* env) -> GetObjectArrayElement (env, jobjarray, idx))' 'aufrufen –

Verwandte Themen