在 JNI 上调用 AttachCurrentThread 成本高吗?

Is calling AttachCurrentThread on JNI costly?

我在这里 找到了一个函数调用,它使用 AttachCurrentThread 附加线程,执行调用然后使用 DetachCurrentThread 分离它。

我想知道这个过程是否很昂贵。我有一个 C++ 函数

void sendEvent(Event event) {
    //call java function here
}

这将被多个 C++ 线程调用以将事件发送到 Java 端,因此我不能简单地附加一个线程并且从不分离它,因为许多不同的线程将调用 sendEvent。所以我想知道在每次 sendEvent 调用时执行 AttachCurrentThread、调用 Java 和 DetachCurrentThread 是否代价高昂。如果是,我应该怎么做?

尽管您可以将调用线程附加到每个 JNI 调用基础上,但您真的不应该,除非您别无选择。本机线程必须先将自身附加到 JVM,然后才能进行 JNI 调用。为了避免不必要的开销,线程确实应该尽快附加自身(至少在第一次 JNI 调用之前),并保持附加状态直到它不再需要进行任何进一步的 JNI 调用。