0

如何从 Java 活动中调用 c++ 方法?

这是我的 Java 代码:

public class TestActivity extends QtActivity
{
  public native void resultRead(String maskedPan);

  @Override
  protected void onNewIntent(Intent intent)
  {
    ... do something here with the received intent

    resultRead("result");
  }
}

这是我的 C++ 代码:

static void onResultRead(JNIEnv *env, jobject /*thiz*/, jstring value)
{
  qDebug() << env->GetStringUTFChars(value, nullptr);
}

void MyClass::registerJni()
{
  QAndroidJniEnvironment env;
  QAndroidJniObject javaClass("org/test/testproject/TestActivity");
  JNINativeMethod methods[] {{"resultRead", "(Ljava/lang/String;)V", reinterpret_cast<void *>(onResultRead)}};
  jclass objectClass = env->GetObjectClass(javaClass.object<jobject>());
  env->RegisterNatives(objectClass, methods, sizeof(methods) / sizeof(methods[0]));
  env->DeleteLocalRef(objectClass);
}

当 Java 代码调用 resultRead 函数时,我的应用程序崩溃并出现以下异常:

F art     : art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: JNI GetObjectClass called with pending exception java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
F art     : art/runtime/java_vm_ext.cc:470]   at void android.os.Handler.<init>(android.os.Handler$Callback, boolean) (Handler.java:200)
F art     : art/runtime/java_vm_ext.cc:470]   at void android.os.Handler.<init>() (Handler.java:114)
F art     : art/runtime/java_vm_ext.cc:470]   at void android.app.Activity.<init>() (Activity.java:794)
F art     : art/runtime/java_vm_ext.cc:470]   at void org.qtproject.qt5.android.bindings.QtActivity.<init>() (QtActivity.java:94)
F art     : art/runtime/java_vm_ext.cc:470]   at void org.test.testproject.TestActivity.<init>() (TestActivity.java:12)

有什么建议吗?

4

0 回答 0