Re: JNI Глобальные обьекты
От: alsemm Россия  
Дата: 23.05.07 12:50
Оценка: 6 (1)
Здравствуйте, loknalori, Вы писали:

...

L>P.S. могу перефразировать задачу. Необходимо сделать вызвать метод в JAVA из С++ ф-ии, которая на входе не имеет енвиромента и обьекта (не JNI спецификации)

1. Объект запомнить используя NewGlobalRef;
2. Получить JNIEnv можно так:

// jvm, инициировать можно либо через вызов JNI_GetCreatedJavaVMs (если нет JNIEnv), либо, если есть JNIEnv, то GetJavaVM
static JavaVM* vm = 0;

// возвращает JNIEnv для произвольного потока (не важно создан-ли он VM-ой или нет):
class JVMAttachee
{
    JNIEnv* env_;
    bool    detach_;

private:
    JVMAttachee(const JVMAttachee&);
    JVMAttachee& operator = (const JVMAttachee&);

public:
    explicit JVMAttachee(): env_(0), detach_(false)
    {
        if(vm)
        {
            vm->GetEnv((void**)&env_, JNI_VERSION_1_2);
            if(!env_)
            {
                if(JNI_OK == vm->AttachCurrentThread((void**)&env_, 0))
                {
                    detach_ = true;
                }
            }
        }
    }

    ~JVMAttachee()
    {
        if(detach_)
        {
            vm->DetachCurrentThread();
        }
    }

    JNIEnv*
    getEnv()
    {
        return env_;
    }
};


Юзать так:
void foo()
{
    JVMAttachee vma;

    JNIEnv* env = vma->getEnv();

    env->CallVoidFunction(...);
}


Если в приложении потоков не созданных из VM нет, то беспокоиться о AttachCurrentThread особого смысла нет и можно обойтись только GetEnv.

Алексей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.