我使用以下代码创建、使用和删除一个带有 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));
}
最后,为了将指针存储在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/。