【问题标题】:best strategy for attaching arbitrary threads to Android JVM将任意线程附加到 Android JVM 的最佳策略
【发布时间】:2012-02-18 07:52:46
【问题描述】:

我发现自己需要从任意本地回调到 JVM 可能会或可能不会长期存在的线程。通话很简单 AttachCurrentThread 在每个 Java 方法调用之前 假设如果线程已经是(可能很快)没有操作 附加,但我发现自己想知道 JVM 对附加有什么作用 当本地线程离开本地某个地方时,没有 正式分离。或者换句话说,这将是一个 问题?如果是这样,那么我发现自己想知道 为每个 Java 方法调用附加/分离。理想情况下,每个 线程只会在启动时注册自己并在关闭时分离 但同样,我正在编写必须可以从任意位置调用的代码 运行代码的线程不知道它在 Android 内部运行, 所以在这种情况下这不是一个现实的选择。

对这件事有什么想法吗?

【问题讨论】:

    标签: android android-ndk java-native-interface


    【解决方案1】:

    我发现自己想知道当附加的本机线程在本地的某个地方离开而没有被正式分离时,JVM 会如何处理它们。

    当所有非守护线程都退出时,常规 VM 会关闭。在不分离的情况下附加线程意味着VM无法退出并且必须先等待您的线程分离。不过,这只是 VM 的一般情况。在 Android 中这应该不是问题,因为应用程序并没有真正“退出”。 Source.

    强烈建议分离线程以进行正确的内存管理(请参阅official recommendation)。

    我正在编写的代码必须可以从运行代码的任意线程调用,而这些代码不知道它在 Android 内部运行,因此在这种情况下这不是一个现实的选择。

    实际上,自分离线程的实现非常简单。将“析构函数”引用传递给pthread_key_create(destKey_, threadDestructor);,并在此“析构函数”内部调用JNI 方法cached_jvm->DetachCurrentThread();

    希望有帮助!

    【讨论】:

    • 谢谢,但正如我所说,这些线程通常是由我无法控制的库代码创建和销毁的,但它们发现自己需要调用我的库并因此进入 JNI。或者换句话说,我无法访问析构函数(如果它存在的话)......
    • 哦,等等。根据 Android 开发者网站,我想我明白了你的意思。我想这会奏效。谢谢!
    • stackoverflow.com/questions/26534304/…TL;NR:正确分离在 Android 上是必不可少的。
    猜你喜欢
    • 2020-09-27
    • 2017-08-05
    • 2021-09-19
    • 2017-05-17
    • 1970-01-01
    • 2020-10-31
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多