2016-04-11 23 views
0

getまたはsetメソッドの呼び出しがクラッシュする。オブジェクト配列が有効です。 Jobs.Arrayに挿入中にエラーが発生しました。また、Jobjectから値を取得しようとしました。ゲッタとセッタが失敗します。JNIからJavaメソッドを呼び出すと、プログラムがクラッシュする

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オブジェクトは以下の通りです:JNIへ

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

コールは以下の通りです:

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

コードにエラーチェックを追加することを検討しましたか?すべての* JNIメソッドに無効な戻り値があるかどうかをチェックして、成功したと仮定するのではなく、適切な処置をとる必要があります。この場合、メソッドIDの値は何ですか? – EJP

+0

その直面では、 'jclass1'は** DataAvailable **ではなく、** demo.JNIWrapper **です。 –

+1

@EJPが尋ねたことを強調すると、 'jobject j'の値は何ですか?オブジェクト配列が 'null'要素を持っていて、簡単な' printf( "これは行2 \ n"); 'を出力することは可能です。これまでのコードの成功または失敗については何も教えてくれません。前のコード**はクラッシュしませんでした**。また、 'printf()'から 'stdout'には、バッファされているという点で問題があります。出力が見えないということは、必ずしもラインに到達していないことを意味するものではなく、単に出力されなかったことを意味します。バッファがフラッシュされる前にプロセスがクラッシュした場合、出力は表示されません。 –

答えて

1

明白な問題があります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の失敗はハードクラッシュで非常に醜いです。

DataAvailableのjclassを照会し、それを使用する必要があります。

+0

Cコード内のオブジェクトの配列を取得するにはどうすればよいですか?jobjarrayからオブジェクト型を取得することは可能ですか? –

+0

はい、 '(* env) - > GetObjectClass(env、(* env) - > GetObjectArrayElement(env、jobjarray、idx))' –

関連する問題