【问题标题】:Call a static java method of another package from native code从本机代码调用另一个包的静态 java 方法
【发布时间】:2011-11-06 11:53:16
【问题描述】:

例如,假设在 Android 中,我需要调用静态方法 android.os.SystemClock.elapsedRealtime(),它会从部分原生代码中返回一个 long。在mylib.c 文件中,我有

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 的新手。

谁能指出我的错误?

【问题讨论】:

    标签: java android static java-native-interface android-ndk


    【解决方案1】:

    看起来您对 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了解更多详情

    【讨论】:

    • 几分钟前我自己发现了这个!但是,我必须指定类的名称,例如(*env)->FindClass(env, "android/os/SystemClock")。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多