簡體   English   中英

從JNI調用Java方法會導致程序崩潰

[英]Calling Java Methods from JNI results in program crash

調用get或set方法崩潰。 對象數組有效。 它一直打印到第2行。最初插入到jobjectArray時出現錯誤。還嘗試從Jobject獲取值.getter和setter都失敗了。

JNICode如下:

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

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

}       

我的Java對象如下所示:

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

致電JNI如下:

public native int pax_store_get_data_avail_info(DataAvailable[] stats_array);

明顯的問題是pax_store_get_data_avail_info()不是DataAvailable的方法。 這是其他類的方法嗎? 您實際上並沒有說這是什么。 但讓我們假設它是:

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

調用此方法時,獲得的jclass jclass1參數用於“ X”,而不用於DataAvailable。 因此,您對GetMethodID()的調用可能會失敗。 您無需檢查返回值,因此可能會將錯誤的方法ID交給下一個調用。 JNI失敗是硬崩潰,而且非常丑陋。

您需要在jclass中查詢DataAvailable並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM