将任意线程附加到Android JVM的最佳策略

时间:2012-01-25 03:28:36

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

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

对此事的任何想法?

1 个答案:

答案 0 :(得分:2)

  

我发现自己想知道当JVM在原生土地的某个地方离开而没有被正式分离时,JVM对附加的本机线程做了什么。

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

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

  

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

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

希望有所帮助!