【发布时间】:2014-06-13 03:29:09
【问题描述】:
我有基本的 ndk 项目:
NdkTest.java 类和ndk.cpp 文件。现在我有应该创建一次的 C++ 对象,并在应用程序被杀死或关闭时销毁。
所以我的NdkTest.java 看起来像这样:
NdkTest {
static {
System.loadLibrary("testLib");
}
public static native method1();
public static native method2();
}
ndk.cpp 看起来像这样:
#include <jni.h>
extern "C" {
void packageName_ClassName_method1(Env *, class);
void packageName_ClassName_method2(Env *, class);
}
ManagerClass *manager = NULL; //this is actually in .h file but for simplicity of this example I put it here
void packageName_ClassName_method1(Env *env, class clazz) {
if(manager==NULL) {
manager = new Manager();
}
manager->method1();
}
void packageName_ClassName_method2(Env *env, class clazz) {
if(manager==NULL) {
manager = new Manager();
}
manager->method2();
}
现在... manager 应该只创建一次,它应该被我所有的本地方法使用。此代码将编译并工作,但它会导致内存泄漏,因为管理器永远不会被破坏。应该在哪里销毁?
当然,我可以创建像 createManager() 和 destroyManager() 这样的 java 方法,但我不想这样做。甚至可能吗?
我尝试像这样使 Manager 对象成为全局对象:
ManagerClass manager;
void packageName_ClassName_method1(Env *env, class clazz) {
manager.method1();
}
void packageName_ClassName_method2(Env *env, class clazz) {
manager.method2();
}
它也可以工作,但我不知道它的析构函数是否被调用过。我在那里输入了登录信息,但它从未显示过。
所以我的问题是:在 Android 原生开发中处理释放内存的最佳方法是什么?有什么好的模式吗?如果唯一的方法是创建 java 方法createManager() 和destroyManager() 那么我应该在哪里调用destroyManager()? Java finalize() 不能保证被调用,我应该把它放在哪里?
我找到了关于这个主题的精彩视频:
大约 31 分钟。是最好的部分:)
【问题讨论】:
标签: java android c++ memory android-ndk