在这个代码示例中,AssetManager类成员会被JVM垃圾收集吗?
In this code example, will the AssetManager class member be garbage collected by the JVM?
我有一个情况,我的Java接口与c++代码(Android - JNI/NDK)。
正如在下面的代码注释中所解释的那样,我试图阻止AssetManager实例被垃圾收集(因为我在本机代码中使用了这个实例)。
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public class AndroidLauncher extends AndroidApplication implements DroidBlaster {
// We need a reference to AssetManager (used by DroidBlaster JNI/NDK),
// in order to ensure that the AssetManager instance which is passed to
// native method DroidBlaster::create, is not garbage collected while
// the native object is in use. Furthermore we pass an instance of
// AndroidLauncher (this) to the Flm::initialize method, in order to
// ensure this class is not garbage collected.
private AssetManager assetManager;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
AssetManager assetManager = getAssets();
initialize(new Flm(App.Type.PRO, this), config);
}
// ...
// ....
}
现在,Flm类(上面代码中由initialize方法实例化的那个)包含一个静态DroidBlaster成员(它的接口由AndroidLauncher类实现),该成员在构造函数中初始化。
public class Flm extends Game {
static DroidBlaster droidblaster;
public Flm(App.Type aAppType, final DroidBlaster droidblaster) {
super();
App.instance.setType(aAppType);
this.droidblaster = droidblaster;
}
// ...
// ....
}
我怀疑,这个实现是正确的,以确保,在Flm实例的存在,AndroidLauncher的AssetManager成员,将永远不会被垃圾收集??
如果要使用本机代码中的对象,则需要对其进行本地或全局JNI引用。将对象传递给本机方法,或者使用JNI调用从字段中提取对象,都会创建一个本地引用。当有问题的线程返回VM时,这些线程将过期并被丢弃。
如果你想要一个引用在调用本机代码时仍然有效,你需要用NewGlobalRef
创建一个全局引用。它们不会过期,当不再需要时必须显式删除。
试图用Java编写的代码来保存对象实际上是没有意义的。如果对象对本机代码还不可见,那么它是否被收集也无关紧要——显然没有任何东西保存对它的引用。如果对象对本机代码可见,并且不能被丢弃,那么您应该从本机代码创建一个全局引用。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 在这个代码示例中,AssetManager类成员会被JVM垃圾收集吗?