2017-12-19 17 views
0

JavaとJNIが比較的新しいです。私は、Javaのインスタンスメソッドが 無効SETSTATE(ブールが行われる)があると私はJNICallObjectMethodでブール値の引数を渡そうとしているJNIで

tbuff = env->GetObjectClass(buff); 
jmethodID setStatemid = env->GetMethodID(tbuff, "setState", " 
(Ljava/lang/Boolean;)V"); 

if(setStatemid==0){ 
    return JNI_FALSE; 
} 

// Set the buffer to busy 
env->CallObjectMethod(buff, setStatemid, true); 

CallObjectMethodへの呼び出し()クラッシュを使用して、C++から呼び出すしようとしています。私はJNI_TRUEまたはJNI_FALSEも渡してみました。私はfalseまたはJNI_FALSEを渡す場合、私はメソッドにそれを行うが、渡された値はnullです。私が合格すると、JVMがクラッシュします。これに基づいて、私はブールオブジェクトを正しく渡していないと仮定しています。

任意のガイダンスは、私が適切にBooleanオブジェクトを渡していない午前と仮定していますこれに基づき

+0

? – vcp

+0

env-> ExceptionCheck()を使用してJNI環境エラーが存在するかどうかを確認しましたか? –

+0

@Will_Panda既にJVMクラッシュがあった場合、彼は 'ExceptionCheck()'をどのように呼び出すことができますか? – EJP

答えて

3

を高く評価しました。

Booleanは一切渡していません。整数またはC++ boolを渡しているか、値がtrueのものであれば何でも構いません。

trueではなく、BooleanのJavaを渡す必要があります。具体的には、Boolean.TRUEです.JNI経由で最初にアクセスする必要があります。

さらにsetState()メソッドをbooleanとし、JNI_TRUEとします。

また、メソッドにvoid戻り値の型があるので、CallVoidMethod(),CallObjectMethod()と呼ぶべきです。

+0

ありがとうございます。それだった!私はブールとブールの違いを認識していませんでした。私は彼らが2つの異なるタイプであることを気づかなかった。 CallVoidMethod()の使用について。このコードはいくつかの初期プロトタイプの一部であり、署名が変更されています。私は適切な機能を使用します。 @Will_Panda私は例外もチェックします。コメントありがとうございました。 – JGrecco

0

私はそれが古い質問だと知っていますが、正解はまだありません。あなたは、「Z」にマッピングされているプリミティブ型booleanを使用する必要があります

https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.htmlを参照)

だからあなたのコードは次のようなものでなければなりません。代わりにCallVoidMethodのCallObjectMethodを呼び出すなぜ任意の理由

jmethodID setStatemid = env->GetMethodID(tbuff, "setState", "(Z)V"); 
関連する問題