JNI文档声明本地Java对象引用在范围内,直到本机方法返回为止;他们也是该线程的本地人。
当应用程序托管Java VM时,可以在任何本机方法之外创建Java对象引用。一旦JVM运行,主机应用程序可以获得JNIEnv
并创建它想要的所有Java对象。假设这种情况产生了本地参考。
请问这些人的生命周期是什么?只要JVM存在,它们是否存活(除非明确释放)?他们也是本地人吗?如果在工作线程上,一旦线程与JVM分离,它们是否会超出范围?
特别是关于线程局部性:到目前为止,在线程之间重用类对象(从FindClass()
返回)将对我有效。但这违反了JNI规则吗?
答案 0 :(得分:3)
可以通过以下方式获得可用于创建本地参考的有效JNIEnv
:
GetEnv致电。
3.1。来自JNI_OnLoad
,Agent_OnLoad
,Agent_OnAttach
条目。在这些条目中创建的本地引用在从条目返回之前有效。
3.2。来自AttachCurrentThread函数附加的线程。在调用DetachCurrentThread之前,引用将一直存在。
所有本地参考都是only valid in the thread,在其中创建它们。本机代码不能将本地引用从一个线程传递到另一个线程。
请注意,JVM保证 1,2 可以在一个帧中创建16个本地引用。如果您需要更多本地参考,则必须使用PushLocalFrame / PopLocalFrame JNI函数明确管理它们。
jclass
,jthread
,jstring
,jarray
等都是JNI references,如jobject
。它们也需要进行管理,而不是jmethodID
和jfieldID
,而不是JNI引用。