2016-12-21 11 views
0

問題を回避することができないため、どのJNIエキスパートでも次のような状況を説明できますか?Java、JNI、クラス宣言

たちは、このクラスを持っていると言う:JNI(C)で

public class MyClass { 
    static { 
     System.loadLibrary("recorder"); 
    } 

    private native long function1();  
    private native void function2(); 

    private void callback() { 

    } 

    public static void main(String[] args) throws Exception { 
     MyClass obj1 = new MyClass(); 
     obj1.function1(); 
    } 

} 

JNIEXPORT jstring JNICALL function1(JNIEnv *env, jobject object) { 
    jclass cls = (*env)->GetObjectClass(env, object); 
    jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "()V"); 

    if (mid != NULL) { 
     (*env)->CallVoidMethod(env, object, mid); 
    } 
} 

代わり

private native long function1(); 

の私は

を宣言する場合、これは、しかし、正常に動作します
private static native long function1(); 

JNIからJavaへの呼び出しで、Javaで関数コールバックが見つからないと不平を言って失敗します。静的なネイティブメソッドの場合

おかげ

+0

'function1()'の静的バージョンを呼び出すと、 'object'引数がNULLになると思います。したがって、 'cls'もNULLで、' mid'もNULLです。 – gudok

答えて

1

ネイティブコードで2番目の引数はjobjectしかしjclassすべきではありません。

しかし、手作業で書くのではなく、javahツールでcヘッダーを生成するべきです。

+0

技術的には正しくありません。 C側で 'jobject'と' jclass'は同じことを定義しています。違いはありません。実際の問題は、「非静的メソッドへの静的参照を作成できません」というコンパイラー・メッセージと同等です。 'function1'が静的であれば、オブジェクトがないので静的でない' callback'にアクセスすることはできません。 – user2543253

+0

@ user2543253彼は値が間違っていると言っています。型が互換性がないわけではありません。異なるが同じ型の理由は、可能な限りヒントを強くすることです。 –

+0

@彼は実際に値が間違っていると言っているのかどうかわからない。答えの中のオブジェクトやクラスについては何もありませんが、代わりに 'javah'を使ってヘッダを生成するという部分があります。これは私のアドバイスでもありますが、OPが「静的」を後で追加したように見えるので、ここで助けたとは思えません。コンパイルされているため、宣言が 'jobject'から' jclass'に変更されたことに気付かないでしょう... – user2543253