2016-04-11 15 views
0

Arama alma veya ayarlama yöntemleri çöküyor. Nesne dizisi geçerlidir. Satır 2'ye kadar yazdırır. JobjectArray'e yerleştirilirken hata oluyordu. Ayrıca Jobject'den değer almayı denediler.JNI'den Java Yöntemlerini Çağırmak program çökmesine neden olur

JNICode aşağıdaki gibidir:

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

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

}  

Benim Java Nesne olarak Aşağıda geçerli: JNI için

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

Çağrı aşağıdaki gibidir:

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

Kodunuza hata denetimi eklemeyi düşündünüz mü? Geçersiz bir dönüş değeri için * her * JNI yöntemini kontrol etmeli ve yalnızca başarılı olduklarını değil, uygun eylemi gerçekleştirmelisiniz. Bu durumda, yöntem kimliğinin değeri neydi? – EJP

+0

Yüzünde, 'jclass1' ** DataAvailable ** değil, ** demo.JNIWrapper **. –

+1

@EJP'nin ne istediğini vurgulayarak, 'jobject j''nin değeri nedir? Bir nesne dizisinin 'null' öğelerine sahip olması ve basit bir printf ("Bu satır 2 \ n") yayabiliyor olması oldukça olasıdır; 'önceki herhangi bir kodun başarısı ya da başarısızlığı hakkında hiçbir şey söyleyemez - yalnızca size bildirir. Önceki kod **, düzgün çalışmadığı için ** çökmedi. Ayrıca, printf() '' stdout' için sorun yoktur, çünkü * buffered *. Çıktının görülmemesi, bu hatta ulaşılmadığı anlamına gelmez - sadece çıktı olmadığı anlamına gelir. İşlem arabellek temizlenmeden önce çökerse, çıktıyı görmezsiniz. –

cevap

1

göze batan bir konudur Bu pax_store_get_data_avail_info() bir DataAvailable yöntemi değildir. Başka bir sınıfın bir metodu mu? Aslında ne olduğunu söylemiyorsun. Ama öyle varsayalım:

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

Eğer bu yöntem diyoruz

elde edersiniz jclass jclass1 argüman değil, DataAvailable için "X" içindir. Bu nedenle GetMethodID() çağrınız başarısız olabilir. Dönüşü kontrol etmiyorsunuz, bu yüzden muhtemelen bir sonraki çağrıya kötü bir yöntem kimliği veriyorsunuz. JNI başarısız, sert çöküyor ve çok çirkin.

DataAvailable için jclass'ı sorgulamanız ve bunu kullanmanız gerekir.

+0

C kodumdaki nesneler dizisini nasıl alabilirim? Nesne türünü jobjarray'dan almak mümkün. –

+0

Evet, '(* env) -> GetObjectClass (env, (* env) -> GetObjectArrayElement (env, jobjarray, idx))' yi çağırabilirsiniz. –

İlgili konular