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; }
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; }
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())); }
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; }
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; }
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; }
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 }
void detach() throw () { getJavaVM()->DetachCurrentThread(); }
static void deattachToAndroidThreadJava(){ (*(getJavaVM()))->DetachCurrentThread(getJavaVM()); }
static void attachToAndroidThreadJava(){ (*(getJavaVM()))->AttachCurrentThread(getJavaVM(), &javaEnvMainThread, NULL); }
JavaVM *QAttachedJNIEnv::javaVM() { return getJavaVM(); }
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; }