使用 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。
我正在尝试从 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。