我使用下面的代碼創建,使用和刪除一個帶有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/a-c-smart-pointer-wrapper-for-use-with-jni/