2011-08-30 52 views
9

例如,假设在Android中,我需要调用静态方法android.os.SystemClock.elapsedRealtime(),该方法从本机代码的一部分返回一个long。在mylib.c文件,我有从本机代码调用另一个包的静态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); 
} 

在Java MyClass.class,我等

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的对象。您应该使用(*env)->FindClass(env, "android/os/SystemClock")来获取SystemClock的jclass。然后拨打(*env)->GetStaticMethodID(env, cls,"elapsedRealtime", "(V)J");以获取方法ID。看看JNI tutorial进一步的细节

+2

我几分钟前发现了我自己!但是,我必须指定类的名称,例如'(* env) - > FindClass(env,“android/os/SystemClock”)'。谢谢! – Tom

+0

你是对的。这是一个错字/复制粘贴错误:-) – jogabonito

相关问题