Android ndk 具有相同地址的不同Java对象、IsSameObject不工作以及相关的全局引用管理问题

Android ndk 具有相同地址的不同Java对象、IsSameObject不工作以及相关的全局引用管理问题,android-ndk,java-native-interface,Android Ndk,Java Native Interface,我已经为这个问题绞尽脑汁一个星期了,现在我开始了解到底发生了什么,但不知道为什么,也不知道如何解决它 让我描述一下我在做什么。我在Java中有各种各样的对象,我有一个本机库。Java对象通过调用nativellibrary.AddObject(this)通知库它们的存在。本机库有一个jobjects容器,我在其中存储对Java对象的全局引用,这些引用是通过env->NewGlobalRef(object)获得的。本机库使用这些存储的引用来访问Java对象,并且工作正常 这里有一个关键的部分不起作

我已经为这个问题绞尽脑汁一个星期了,现在我开始了解到底发生了什么,但不知道为什么,也不知道如何解决它

让我描述一下我在做什么。我在Java中有各种各样的对象,我有一个本机库。Java对象通过调用
nativellibrary.AddObject(this)
通知库它们的存在。本机库有一个
jobject
s容器,我在其中存储对Java对象的全局引用,这些引用是通过
env->NewGlobalRef(object)
获得的。本机库使用这些存储的引用来访问Java对象,并且工作正常

这里有一个关键的部分不起作用。显然,我希望能够删除Java对象,而不仅仅是添加它们。因此,当不再需要Java对象时,它会调用
nativellibrary.RemoveObject(this)
。本机库通过迭代存储对象列表(您可能还记得,这些对象都是全局引用)并查找与
env->IsSameObject(passedObject,storedObjectGlobalReference)

这里的问题是:它没有像预期的那样工作,Java对象没有正确匹配到它们的全局引用。当我开始挖掘并记录所有带有所有参数的调用时,我注意到一件奇怪的事情:本机调用的
jobject
参数(这是Java对象的
this
)对于不同的对象具有相同的值!此外,此值在``nativellibrary.AddObject(this)
nativellibrary.RemoveObject(this)`调用同一对象之间变化


那么,发生了什么,我如何在本机代码中存储、跟踪和删除对Java对象的引用?重申:只要我只创建和存储全局引用,一切都很好;正确的对象通过这些引用接收通知,没有问题。但是,当我尝试通过
env->DeleteGlobalRef
删除这些引用时,我发现在
nativellibrary.RemoveObject(this)
实现中,存储的引用与传递的
jobject
无法匹配,我也遇到了同样的问题。根本原因是添加的项
nativellibrary.AddObject(this)
与我调用
nativellibrary.RemoveObject(this)
时的对象不同。我使用的是junit,这导致了问题,因为junit创建了多个对象来运行每个测试。我在Java端使用
对象
时发现了问题。在添加函数之前
System.out.println(“添加对象:+sameObject”)和删除函数之前
System.out.println(“删除对象:+sameObject”)。很抱歉英语不好,我希望这能帮助别人。

我也有同样的问题。根本原因是添加的项
nativellibrary.AddObject(this)
与我调用
nativellibrary.RemoveObject(this)
时的对象不同。我使用的是junit,这导致了问题,因为junit创建了多个对象来运行每个测试。我在Java端使用
对象
时发现了问题。在添加函数之前
System.out.println(“添加对象:+sameObject”)和删除函数之前
System.out.println(“删除对象:+sameObject”)。很抱歉英语不好,我希望这能帮助别人。

如果我理解,您将“this”称为对对象的本地引用,该对象在完成方法执行后立即删除。因此,您无法将指针的整数值与那些“this”对象进行比较。您能否发布
nativellibrary.AddObject(this)
nativellibrary.RemoveObject(this)
?@V-master:这可以解释一些事情。那么您是说在本机调用之间比较
jobject
值(在Java代码中是
this
)是没有意义的?但这并不能解释为什么<代码> ISAMEObjs<代码>提供错误的结果和错误的引用匹配…@安德鲁0x1:它比我描述的更复杂,涉及到几个C++类和不同的方法。让我看看我能做什么。从你的描述中没有明显的错误。。。给定一个jobject,找到一个IsSameObject的全局引用,然后删除GlobalRef。只要AddObject保证您只有一个对该jobject的全局引用,它就应该是1:1。您能否更具体地说明“Java对象如何与其全局引用不正确匹配”,以及为什么您认为这是VM中的一个失败?也许可以举一个失败的调用模式的例子。如果我理解的话,您将“this”称为对对象的本地引用,它在方法执行完成后立即被删除。因此,您无法将指针的整数值与那些“this”对象进行比较。您能否发布
nativellibrary.AddObject(this)
nativellibrary.RemoveObject(this)
?@V-master:这可以解释一些事情。那么您是说在本机调用之间比较
jobject
值(在Java代码中是
this
)是没有意义的?但这并不能解释为什么<代码> ISAMEObjs<代码>提供错误的结果和错误的引用匹配…@安德鲁0x1:它比我描述的更复杂,涉及到几个C++类和不同的方法。让我看看我能做什么。从你的描述中没有明显的错误。。。给定一个jobject,找到一个IsSameObject的全局引用,然后删除GlobalRef。只要AddObject保证您只有一个对该jobject的全局引用,它就应该是1:1。您能否更具体地说明“Java对象如何与其全局引用不正确匹配”,以及为什么您认为这是VM中的一个失败?也许可以给出一个失败调用模式的示例。