使用智能指针可以避免手动分配和释放内存的复杂问题,而且可以确保内存资源的正确释放。在 C++ 文件中使用 std::shared_ptr 或 std::unique_ptr 进行内存管理。
示例代码:
#include
//创建一个智能指针来管理内存
std::shared_ptr myIntSharedPtr = std::make_shared();
在 JNI 接口中要手动释放分配的内存,并确保在从 JNI 返回时垃圾回收器可以正常正常回收该内存资源。可以使用相应的释放函数,如 free()、delete 等进行内存释放。
示例代码:
JNIEXPORT void JNICALL Java_com_example_app_MainActivity_release(JNIEnv *env, jobject thiz) {
// 释放 C++ 对象内存
jclass clazz = env->FindClass("com/example/app/NativeClass");
jfieldID handleField = env->GetFieldID(clazz, "mNativeObject", "J");
jlong nativeObjectPtr = env->GetLongField(thiz, handleField);
if (nativeObjectPtr != 0) {
NativeClass* nativeObject = reinterpret_cast(nativeObjectPtr);
delete nativeObject;
env->SetLongField(thiz, handleField, 0);
}
// 释放 JNI 局部引用
env->DeleteLocalRef(clazz);
// 释放其他局部引用
env->DeleteLocalRef(thiz);
// 强制进行垃圾回收
System.gc();
}
全局变量会一直保存,直到程序运行结束而不被垃圾回收器处理。在 JNI 接口中要特别注意此类变量的使用,应该尽量避免使用全局变量。
示例代码:
static jobject activity;
JNIEXPORT void JNICALL Java_com_example_app_MainActivity_setActivity(JNIEnv *env, jobject thiz) {
activity = env->NewGlobalRef(thiz);
}
// 避免使用全局变量
JNIEXPORT void JNICALL Java_com_example_app_MainActivity_update(JNIEnv *env, jobject thiz) {
//...
}