Используйте метод NewGlobalRef для ссылки на глобальную ссылку - PullRequest
0 голосов
/ 10 мая 2019

Я пишу приложение для Android jni и хочу использовать множество глобальных ссылок. Могу ли я ссылаться на глобальную ссылку с помощью 'NewGlobalRef' ?

Я попробовал следующее, и это работает, но я не знаю, разрешено ли это. Я также не знаю, является ли принцип NewGlobalRef тем, указывает ли глобальная ссылка на глобальную ссылку или две глобальные ссылки указывают на объект (например, shared_ptr)?

#include <jni.h>

class A {
public:
    A(JNIEnv * env, jobject obj) : env(env)
    {
        globalRef = env->NewGlobalRef(obj);
        env->DeleteLocalRef(obj);
    }
    A(const A & a) : env(a.env)
    {
        // a global reference points to a global reference ?
        // or two global references point to an object ?
        globalRef = env->NewGlobalRef(a.globalRef);
    }
    ~A()
    {
        env->DeleteGlobalRef(globalRef);
        globalRef = nullptr;
    }
private:
    JNIEnv * env;
    jobject globalRef;
};

// main entry
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void * reserved)
{
    JNIEnv *env;
    if (jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK)
        return JNI_ERR;
    A a1(env, env->NewStringUTF("somthing"));
    A a2(a1);
    a1.~A();
    // Can I continue to use 'a2' after 'a1' is destroyed ?
    return JNI_VERSION_1_4;
}

Я ожидаю, что смогу продолжать использовать «a2» после уничтожения «a1».

...