【问题标题】:Is calling AttachCurrentThread on JNI costly?在 JNI 上调用 AttachCurrentThread 成本高吗?
【发布时间】:2019-11-11 23:47:03
【问题描述】:

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

我想知道这个过程是否成本高昂。我有一个 C++ 函数

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

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

【问题讨论】:

  • 可以设置线程析构回调,在线程被销毁时将线程与JVM分离。请参阅stackoverflow.com/questions/30026030/… 的最后部分注意,使用最新的 NDK 版本,您可以使用thread_locals 以更少的代码完成同样的事情。
  • 附加和分离线程是昂贵的操作,在恶劣的条件下可能会花费您数十毫秒的时间。在您的情况下,最好使用某种预附加线程池或一个带有任务队列的附加线程

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多