Android JNI从本机线程调用Java方法

时间:2017-02-24 16:22:52

标签: android c++ multithreading java-native-interface

我试图从本机代码中的一个线程中调用我的java类中的方法,但没有取得任何成功。这些是全球性的变种:

JavaVM* javaVM = NULL;
jclass activityClass;
jobject activityObj;

代码调用初始化本机代码:

extern "C" {
JNIEXPORT jint JNICALL
naInit(JNIEnv *pEnv, jobject pObj, jstring pFileName, jstring, defaultStorageDirectory) {
  pEnv->GetJavaVM(&javaVM);
  jclass cls = pEnv->GetObjectClass(pObj);
  activityClass = reinterpret_cast<jclass>((jclass) pEnv->NewGlobalRef(cls));
  activityObj = pEnv->NewGlobalRef(pObj);
}
}

线程函数中使用的代码:

void *decodeAndRender(void * args) {
  JNIEnv *env;
  javaVM->AttachCurrentThread(&env, NULL);
  jmethodID retryStartVideoMethodID = env->GetMethodID(activityClass, "retryStartVideo", "()V");
  env->CallVoidMethod(activityObj, retryStartVideoMethodID);
  javaVM->DetachCurrentThread();
  return 0;
}

Java代码:

public void retryStartVideo() {
    Log.d(TAG, "METHOD CALLED FROM CPP ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}

logcat错误:

JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception java.lang.NoSuchMethodError: no non-static method "Ljava/lang/Class;.retryStartVideo()V"

我已将调用类的实例设置为全局引用,并在从线程函数内调用时使用它,但它仍然无法找到该方法。我可以使用类似的代码来调用静态方法没问题,但我需要能够调用非静态方法。

0 个答案:

没有答案