我使用以下代码创建、使用和删除带有 a 的对象std::unique_ptr,同时在 Java 端保持引用(以保持对象处于活动状态,即使在切换活动时也是如此)。
要创建对象并将指针传递给 Java:
void Java_com_domain_project_activity_createObject(JNIEnv *env, jobject obj) {
        Object* object = (std::makeUnique<Object>()).release();
        env->SetLongField(obj, getPtrFieldId(env, obj), (jlong)object);
    }
要删除对象:
void Java_com_domain_project_activity_deleteObject(JNIEnv *env, jobject obj) {
        Object* object = (Object*) env->GetLongField(obj, getPtrFieldId(env, obj));
        delete object;
    }
要处理对象:
void Java_com_domain_project_activity_workOnObject(JNIEnv *env, jobject obj) {
        Object* object = (Object*) env->GetLongField(obj, getPtrFieldId(env, obj));
        // Work on object
}
最后将指针保存在 Java 端:
jfieldID getPtrFieldId(JNIEnv * env, jobject obj)
{
    static jfieldID ptrFieldId = 0;
    if (!ptrFieldId)
    {
        jclass c = env->GetObjectClass(obj);
        ptrFieldId = env->GetFieldID(c, "objPtr", "J");
        env->DeleteLocalRef(c);
    }
    return ptrFieldId;
}
理想情况下,我不会unique_ptr在这些情况下使用,只使用普通指针,但unique_ptr在我的项目中是必需的。
我还发现这个网站非常有用:https ://www.studiofuga.com/2017/03/10/ac-smart-pointer-wrapper-for-use-with-jni/