Ejemplo n.º 1
0
jvalue getJNIField(jobject obj, JNIType type, const char* name, const char* signature)
{
    JavaVM* jvm = getJavaVM();
    JNIEnv* env = getJNIEnv();
    jvalue result;

    memset(&result, 0, sizeof(jvalue));
    if (obj && jvm && env) {
        jclass cls = env->GetObjectClass(obj);
        if (cls) {
            jfieldID field = env->GetFieldID(cls, name, signature);
            if (field) {
                switch (type) {
                case array_type:
                case object_type:
                    result.l = env->functions->GetObjectField(env, obj, field);
                    break;
                case boolean_type:
                    result.z = env->functions->GetBooleanField(env, obj, field);
                    break;
                case byte_type:
                    result.b = env->functions->GetByteField(env, obj, field);
                    break;
                case char_type:
                    result.c = env->functions->GetCharField(env, obj, field);
                    break;
                case short_type:
                    result.s = env->functions->GetShortField(env, obj, field);
                    break;
                case int_type:
                    result.i = env->functions->GetIntField(env, obj, field);
                    break;
                case long_type:
                    result.j = env->functions->GetLongField(env, obj, field);
                    break;
                case float_type:
                    result.f = env->functions->GetFloatField(env, obj, field);
                    break;
                case double_type:
                    result.d = env->functions->GetDoubleField(env, obj, field);
                    break;
                default:
                    LOG_ERROR("Invalid field type (%d)", static_cast<int>(type));
                }
            } else {
                LOG_ERROR("Could not find field: %s", name);
                env->ExceptionDescribe();
                env->ExceptionClear();
                fprintf(stderr, "\n");
            }

            env->DeleteLocalRef(cls);
        } else
            LOG_ERROR("Could not find class for object");
    }

    return result;
}
Ejemplo n.º 2
0
JNIEnv* getJNIEnv()
{
    union {
        JNIEnv* env;
        void* dummy;
    } u;
    jint jniError = 0;

#if OS(ANDROID)
    jniError = getJavaVM()->AttachCurrentThread(&u.env, 0);
#else
    jniError = getJavaVM()->AttachCurrentThread(&u.dummy, 0);
#endif
    if (jniError == JNI_OK)
        return u.env;
    LOG_ERROR("AttachCurrentThread failed, returned %ld", static_cast<long>(jniError));
    return 0;
}
Ejemplo n.º 3
0
void MessageBuffer::addMessage(std::string msg) {

    JNIEnv* env = threading::attachThread(getJavaVM());
    jclass clazz = env->FindClass("edu/gcsc/vrl/ug/UG");
    jmethodID addMessage =
        env->GetStaticMethodID(clazz, "addMessage", "(Ljava/lang/String;)V");

    msg = replaceAll(msg, "\n", "<br>");

    env->CallStaticObjectMethod(clazz, addMessage, stringC2J(env, msg.c_str()));
}
Ejemplo n.º 4
0
JNIEnv* getJNIEnv()
{
    union {
        JNIEnv* env;
        void* dummy;
    } u;
    jint jniError = 0;

    jniError = getJavaVM()->AttachCurrentThread(&u.dummy, 0);
    if (jniError == JNI_OK)
        return u.env;
    fprintf(stderr, "%s: AttachCurrentThread failed, returned %ld\n", __PRETTY_FUNCTION__, static_cast<long>(jniError));
    return 0;
}
Ejemplo n.º 5
0
JNIEnv* getJNIEnv()
{
    union {
        JNIEnv* env;
        void* dummy;
    } u;
    jint jniError = 0;

    jniError = (getJavaVM())->AttachCurrentThread(&u.dummy, NULL);
    if (jniError == JNI_OK)
        return u.env;
    else
        fprintf(stderr, "%s: AttachCurrentThread failed, returned %ld\n", __PRETTY_FUNCTION__, (long)jniError);
    return NULL;
}
Ejemplo n.º 6
0
JNIEnv* attach() throw ( JNIException ) {

    if ( globalHasShutdown ) {
        throw JNIException( "The VM has already been shutdown." );
    }

    JNIEnv* env;

    jint result = getJavaVM()->AttachCurrentThread( reinterpret_cast<void**>( &env ), 0 );

    if ( result != 0 ) {
        string msg = "JNIHelper::attach\n" \
                "Unable to attach the current thread. The specific JNI error code is " +
                std::to_string( result );
        throw JNIException( msg );
    }

    return env;
}
Ejemplo n.º 7
0
void onThreadDestruction() throw ( ::jace::JNIException ) {

#ifdef _WIN32
    if ( hasShutdown() )
        return;
    JavaVM* jvm = getJavaVM();
    ::jace::VmLoader* loader = getVmLoader();
    jobject value = getClassLoader();
    JNIEnv* env;

    // We must ensure that the thread is detached when we leave this function.
    bool mustDetachJVM = value != 0 || jvm->GetEnv( (void**) &env, loader->version() ) != JNI_EDETACHED;
    if ( mustDetachJVM ) {
        if ( value != 0 ) {
            setClassLoader( 0 );
        }
        jace::helper::detach();
    }
#endif
}
Ejemplo n.º 8
0
void detach() throw () {

    getJavaVM()->DetachCurrentThread();
}
Ejemplo n.º 9
0
static void deattachToAndroidThreadJava(){
    (*(getJavaVM()))->DetachCurrentThread(getJavaVM());
}
Ejemplo n.º 10
0
static void attachToAndroidThreadJava(){
    (*(getJavaVM()))->AttachCurrentThread(getJavaVM(), &javaEnvMainThread, NULL);
}
Ejemplo n.º 11
0
JavaVM *QAttachedJNIEnv::javaVM()
{
    return getJavaVM();
}
Ejemplo n.º 12
0
jvalue getJNIField( jobject obj, JNIType type, const char *name, const char *signature)
{
    JavaVM *jvm = getJavaVM();
    JNIEnv *env = getJNIEnv();
    jvalue result;

    bzero (&result, sizeof(jvalue));
    if ( obj != NULL && jvm != NULL && env != NULL) {
        jclass cls = env->GetObjectClass(obj);
        if ( cls != NULL ) {
            jfieldID field = env->GetFieldID(cls, name, signature);
            if ( field != NULL ) {
                switch (type) {
                case array_type:
                case object_type:
                    result.l = env->functions->GetObjectField(env, obj, field);
                    break;
                case boolean_type:
                    result.z = env->functions->GetBooleanField(env, obj, field);
                    break;
                case byte_type:
                    result.b = env->functions->GetByteField(env, obj, field);
                    break;
                case char_type:
                    result.c = env->functions->GetCharField(env, obj, field);
                    break;
                case short_type:
                    result.s = env->functions->GetShortField(env, obj, field);
                    break;
                case int_type:
                    result.i = env->functions->GetIntField(env, obj, field);
                    break;
                case long_type:
                    result.j = env->functions->GetLongField(env, obj, field);
                    break;
                case float_type:
                    result.f = env->functions->GetFloatField(env, obj, field);
                    break;
                case double_type:
                    result.d = env->functions->GetDoubleField(env, obj, field);
                    break;
                default:
                    fprintf(stderr, "%s: invalid field type (%d)\n", __PRETTY_FUNCTION__, (int)type);
                }
            }
            else
            {
                fprintf(stderr, "%s: Could not find field: %s\n", __PRETTY_FUNCTION__, name);
                env->ExceptionDescribe();
                env->ExceptionClear();
                fprintf (stderr, "\n");
            }

            env->DeleteLocalRef(cls);
        }
        else {
            fprintf(stderr, "%s: Could not find class for object\n", __PRETTY_FUNCTION__);
        }
    }

    return result;
}