2011-08-30 10 views
9

たとえば、Androidでは、静的メソッドandroid.os.SystemClock.elapsedRealtime()を呼び出す必要があります。これは、ネイティブコードの一部から長いコードを返します。 mylib.cファイルでは、私はJavaのMyClass.classネイティブコードから別のパッケージの静的Javaメソッドを呼び出す

JNIEXPORT jlong JNICALL 
Java_com_mpackage_MyClass_nativeMethod(JNIEnv *env, jobject obj){ 

    jclass cls = (*env)->GetObjectClass(env, obj); 
    jmethodID mid = (*env)->GetStaticMethodID(env, cls, "android.os.SystemClock.elapsedRealtime", "(V)J"); 

    if (mid == 0) 
    return 0L; 

    return CallStaticLongMethod(cls, mid); 
} 

を持って、私は他の人

static {System.loadLibrary("myLib");} 
native long nativeMethod(); 

の間で持っていますが、私はそれを呼び出すときに、私は次のエラーを取得する:で

ERROR/AndroidRuntime(628): java.lang.NoSuchMethodError: 
android.os.SystemClock.elapsedRealtime() 

mid行の宣言。私はこれが簡単だと思うが、私はjniには新しかった。

誰かが私の間違いを指摘できますか?

答えて

8

あなたのJNI APIの使用法が正しくないように見えます。 最初にandroid.os.SystemClockのクラス参照を取得する必要があります。パラメーターとして渡されたobjは、MyClassのオブジェクトです。 SystemClockのjclassを取得するには、(*env)->FindClass(env, "android/os/SystemClock")を使用する必要があります。次に、(*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");を呼び出してメソッドIDを取得します。詳細についてはJNI tutorialをご覧ください

+2

私は数分前にこれを見つけました!しかし、 '(* env) - > FindClass(env、" android/os/SystemClock ")'のようにクラスの名前を指定しなければなりませんでした。ありがとう! – Tom

+0

あなたは正しいです。それはtypo/copy-pasteの間違いでした:-) – jogabonito

関連する問題