我可以使用std :: unique_lock来连接JNI的AttachCurrentThread和DetachCurrentThread吗?

Guerlando OC:
    class SmartAttachCurrentThread
    {
    public:
        SmartAttachCurrentThread(JavaVM *jvm, JNIEnv *env) : jvm(jvm), env(env)
        {
            //TODO: throw if jvm null?
            jvm->AttachCurrentThread(&env, NULL);
        }

        ~SmartAttachCurrentThread()
        {
            jvm->DetachCurrentThread();
        }

    private:
        JNIEnv *env;
        JavaVM *jvm;
    };

我正在尝试设计一个智能类,该类为我附加当前的jni线程并自动分离,因此可以这样使用:

    {
        JNIEnv *env;
        SmartAttachCurrentThread smartAttachCurrentThread(jvm, env);
        jclass clazz;
        clazz = env->FindClass("com/app/myapp/");
        //call class method
        //thread is detached here prevnting memory leak 
    }

但是AttachCurrentThread里面SmartAttachCurrentThread不会改变JNIEnv *env;就行了

 {
        JNIEnv *env;

有什么好的解决方案?我真的需要这个类吗,或者我可以将它std::unique_lock<T>用于T做相同事情的某种类型

雷米·勒博(Remy Lebeau):

您的类构造JNIEnv*函数按值获取参数,这就是为什么env不更新类外部变量的原因您需要改为通过引用传递它,例如:

class SmartAttachCurrentThread
{
public:
    SmartAttachCurrentThread(JavaVM *jvm, JNIEnv* &env) : jvm(jvm)
    {
        if (!jvm)
            throw ...; // whatever you want

        if (jvm->AttachCurrentThread(&env, NULL) != JNI_OK)
            throw ...; // whatever you want
    }

    ~SmartAttachCurrentThread()
    {
        jvm->DetachCurrentThread();
    }

private:
    JavaVM *jvm;
};

...

{
    JNIEnv *env;
    SmartAttachCurrentThread smartAttachCurrentThread(jvm, env);
    // now you can use env as needed...
}

或者,通过指针传递它,例如:

class SmartAttachCurrentThread
{
public:
    SmartAttachCurrentThread(JavaVM *jvm, JNIEnv **env) : jvm(jvm)
    {
        if (!jvm || !env)
            throw ...; // whatever you want

        if (jvm->AttachCurrentThread(env, NULL) != JNI_OK)
            throw ...; // whatever you want
    }

    ~SmartAttachCurrentThread()
    {
        jvm->DetachCurrentThread();
    }

private:
    JavaVM *jvm;
};

...

{
    JNIEnv *env;
    SmartAttachCurrentThread smartAttachCurrentThread(jvm, &env);
    // now you can use env as needed...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以使用std :: generate获得std :: array <T,2>的向量吗?

我可以使用std :: partial_sort对std :: map进行排序吗?

我可以使用 `std::path::Path` 的 `strip_prefix` 来替换动态前缀吗?

std :: shared_ptr-我可以使用等号(=)进行初始化吗?

我可以使用 std::string 变量作为运算符的参数吗?

我可以使用std :: bind将状态“附加”到函数吗?

我可以使用std :: string * argv作为主要函数参数吗?

我可以使用std :: enable_if摆脱模板专业化吗?

我可以使用std :: copy复制到stringstream中吗

我可以使用 std::vector::swap 修改共享向量吗?

我可以使用带有C ++ 17的std :: any指向成员变量的指针吗?

我可以使用 0-copy 获取 std::stringstream 累积数据的原始指针吗?

即使我没有#include <algorithm>,为什么仍然可以使用std :: max和std :: min?

我可以使用通配符替换吗

骨骼可以使用我的插件吗?

我可以使用多个“ with”吗?

我可以使用RTF格式吗?

我可以使用迭代器吗?

我可以使用javascript表单吗?

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

如果我使用citus,我可以使用join吗?

我可以使用 for 循环来获得相同的结果吗?

我可以使用此列表来填充Arrayadapter吗?

我可以使用 AgensGraph 来迁移数据吗?

我可以使用重构来交换变量的类型吗?

我可以使用 for 循环来创建类吗?

我可以使用锁来确保指令顺序吗?

我可以使用按钮来清除画布吗?

我可以使用distinctUntilKeyChanged来删除重复的对象吗?