RHO_GLOBAL void *rho_nativethread_start() { JNIEnv *env; jvm()->AttachCurrentThread(&env, NULL); store_thr_jnienv(env); return NULL; }
jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) { g_jvm = vm; jint jversion = JNI_VERSION_1_4; JNIEnv *env; if (vm->GetEnv((void**)&env, jversion) != JNI_OK) return -1; pthread_key_create(&g_thrkey, NULL); store_thr_jnienv(env); for(size_t i = 0, lim = sizeof(rho_java_class)/sizeof(rho_java_class[0]); i != lim; ++i) { const char *className = rho_java_class[i]; jclass cls = env->FindClass(className); if (!cls) return -1; jclass globalCls = static_cast<jclass>(env->NewGlobalRef(cls)); if (!globalCls) return -1; env->DeleteLocalRef(cls); g_classes.push_back(globalCls); } return jversion; }
void initjnienv(JNIEnv* env) { if(!pthread_getspecific(g_thrkey)) { store_thr_jnienv(env); } }
//-------------------------------------------------------------------------------------------------- RHO_GLOBAL void *rho_nativethread_start() { JNIEnv *env; jvm()->AttachCurrentThread(&env, NULL); RAWTRACE2("Starting new thread - env: 0x%.8x, functions: 0x%.8x ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", env, env->functions); store_thr_jnienv(env); return NULL; }
//-------------------------------------------------------------------------------------------------- RHO_GLOBAL void rho_nativethread_end(void *) { RAWTRACE1("Thread ended - env: 0x%.8x ===================================================", jnienv()); jvm()->DetachCurrentThread(); store_thr_jnienv(0); }