在JNI上调用AttachCurrentThread是否昂贵?

时间:2019-11-11 23:47:03

标签: java android c++ java-native-interface

我在这里https://stackoverflow.com/a/12901159/6655884找到了一个函数调用,该函数将线程与AttachCurrentThread附加在一起,进行调用,然后与DetachCurrentThread分离。

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

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

将由多个C ++线程调用以将事件发送到Java端,因此我不能简单地附加一个线程,也永远不要分离它,因为许多不同的线程将调用sendEvent。因此,我想知道是否在每次AttachCurrentThread调用时先执行Java DetachCurrentThread,然后再调用Java sendEvent。如果是,该怎么办?

1 个答案:

答案 0 :(得分:4)

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