当前位置: 首页 > 知识库问答 >
问题:

在JNI上调用attachMONtThread代价高昂吗?

松智勇
2023-03-14

我在这里发现https://stackoverflow.com/a/12901159/6655884一个函数调用,它用attachMONtThread附加线程,执行调用,然后用DetachMONtThread分离它。

我想知道这个过程是否代价高昂。我有一个C函数

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

它将被几个C线程调用,以将事件发送到Java端,因此我不能简单地附加一个线程,而永远不会分离它,因为许多不同的线程将调用sendEvent。所以我想知道,每次调用sendEvent调用AttachCurrentThread,调用Java,然后调用DetachCurrentThread,是否代价高昂。如果是,我应该怎么做?

共有1个答案

益清野
2023-03-14

虽然您可以在每个JNI调用基础上附加调用线程,但您真的不应该,除非您别无选择。本地线程必须在发出JNI调用之前将自己附加到JVM。为了避免不必要的开销,线程真的应该尽快附加自己(至少在第一次JNI调用之前),并保持连接,直到它不再需要发出任何进一步的JNI调用

 类似资料:
  • 我的分析器已将以下函数分析确定为热点。 特别是一条汇编指令MOVZX(零扩展移动)负责运行时的大部分。if语句编译为 我想诱使编译器不生成这条指令,但我想我首先需要了解为什么会生成这条指令。考虑到我正在使用相同的数据类型,为什么要使用加宽/零扩展? (在godbolt编译器资源管理器上找到整个函数。)

  • 我们知道捕获异常的代价很高。但是,即使从未抛出异常,在Java中使用try-catch块是否也会很昂贵呢? 我发现堆栈溢出问题/答案为什么try块很贵?,但它是针对.NET的。

  • 当没有在任何一个try-catch块中抛出异常时,使用几个try-catch块是否“慢”?我的问题和这个问题一样,不过是针对JavaScript的。 假设我有20个函数,其中有try-catch块,另一个函数调用这20个函数中的每一个,其中没有一个抛出异常。我的代码会因为这个try-catch块而执行得更慢或更差吗?

  • 问题内容: 任何人都可以指导如何使用GDB调试器在Linux上调试JNI代码(如果可能,请提出其他选择)。 我已经安装了Gdb,但是没有得到如何使用它调试项目的信息。我是否还需要使用-g选项t debug .so文件来编译.cpp文件? 问题答案: 启动您的Java应用程序 使用top,ps,…查找pid 使用此pid启动gdb 附加程序代码 像往常一样使用gdb进行调试 这篇博客文章解释了整个过

  • 这可能是一个真正的新手问题,但我正在编写一个Android应用程序,它需要使用一个用C编写的.so库。该.so由几个类组成,是通用C语言,而不是JNI语言。 除了JNI之外,有没有办法从AndroidJava应用程序调用C函数?我所看到的关于JNI的一切都表明,您必须重写本机代码以特定于JNI,如果只给您一个. so,那真是太不方便了。 在Android 4.0.3中,从java应用程序调用本机函

  • 我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在