在 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 调用。
我在这里 找到了一个函数调用,它使用 AttachCurrentThread
附加线程,执行调用然后使用 DetachCurrentThread
分离它。
我想知道这个过程是否很昂贵。我有一个 C++ 函数
void sendEvent(Event event) {
//call java function here
}
这将被多个 C++ 线程调用以将事件发送到 Java 端,因此我不能简单地附加一个线程并且从不分离它,因为许多不同的线程将调用 sendEvent
。所以我想知道在每次 sendEvent
调用时执行 AttachCurrentThread
、调用 Java 和 DetachCurrentThread
是否代价高昂。如果是,我应该怎么做?
尽管您可以将调用线程附加到每个 JNI 调用基础上,但您真的不应该,除非您别无选择。本机线程必须先将自身附加到 JVM,然后才能进行 JNI 调用。为了避免不必要的开销,线程确实应该尽快附加自身(至少在第一次 JNI 调用之前),并保持附加状态直到它不再需要进行任何进一步的 JNI 调用。