使用 JNI 从 C++ 异步调用 Kotlin 函数

Calling a Kotlin function asynchronously from C++ with JNI

我正在尝试从 C++ 调用在 Kotlin class NativeConnector 中实现的函数 initializationCallback。我读到我首先需要将当前线程附加到 JVM,因为执行此代码的线程不是由 JVM 创建的。

附加本身似乎 working/is 没有产生错误,但获取方法 ID 失败并出现错误:

JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.ClassNotFoundException

运行 来自 JVM 创建的线程的代码在没有将其附加到 JVM 的情况下再次工作得很好,所以在我看来问题是在附加期间发生的。

JNIEnv *env;
int envStatus = javaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if (envStatus == JNI_EDETACHED) {
    if (javaVM->AttachCurrentThread(&env, nullptr) != 0) {
        Log::instance->logError(LOG_TAG, "AttachCurrentThread: failed.");
    }
}

auto clazz = env->FindClass("*/*/*/NativeConnector");
auto methodId = env->GetMethodID(clazz, "initializationCallback", "()V");
env->CallVoidMethod(m_connectorObject, methodId);

if (env->ExceptionCheck()) {
    env->ExceptionDescribe();
}

javaVM->DetachCurrentThread();

迈克尔在评论中回答:

从您自己附加的线程调用 FindClass 可能会出现问题。一种解决方案是在启动时解析所有必要的 class 引用(例如在 JNI_OnLoad 中)并将它们保存为全局引用以备后用。

有关详细信息,请参阅 https://developer.android.com/training/articles/perf-jni#faq:-why-didnt-findclass-find-my-class