jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; g_JavaVM = vm; LOGV("enter JNI_OnLoad"); //jni_thumbnail_init(); if ((*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4) != JNI_OK) { return -1; } (*env)->PushLocalFrame(env,128); initMakeGlobalRef(); makeGlobalRef(env,g_class_video_db_adapter,adapter_path,str_video_db_adapter); g_java_string = (*env)->FindClass(env, "java/lang/String"); g_java_string = (*env)->NewGlobalRef(env,g_java_string); if(!Reg_Uim(env)) { LOGE("error reg uim"); goto ON_LOAD_ERROR; } (*env)->PopLocalFrame(env,0); LOGV("exit JNI_OnLoad ok 0"); return JNI_VERSION_1_4; ON_LOAD_ERROR: (*env)->PopLocalFrame(env,0); return -1; }
jboolean initializeWorker(JNIEnv *env, jobject *javaFront, JavaVM* gJava) { __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "init was "); gJavaVM = gJava; //cache classes mClassCaller = (*env)->FindClass(env, "com/rkapp/JNICaller"); makeGlobalRef(env, &mClassCaller); if (mClassCaller == NULL) { goto ERROR; } //cache java methods MethodOnCleanupEnd = (*env)->GetMethodID(env, mClassCaller, "onFinalizeEnd", "(Z)V"); if (MethodOnCleanupEnd == NULL) { goto ERROR; } MethodOnMassage = (*env)->GetMethodID(env, mClassCaller, "onMassage", "(Ljava/lang/String;)V"); if (MethodOnCleanupEnd == NULL) { goto ERROR; } MethodOnMassageByte = (*env)->GetMethodID(env, mClassCaller, "onMassageByte", "([C)V"); if (MethodOnCleanupEnd == NULL) { goto ERROR; } MethodOnNewFrame = (*env)->GetMethodID(env, mClassCaller, "onNewFrame", "()V"); if (MethodOnCleanupEnd == NULL) { goto ERROR; } mJavaFront = (*env)->NewGlobalRef(env, javaFront); if (mJavaFront == NULL) { goto ERROR; } sendMsgToJava(env, "init was"); return TRUE; ERROR: __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "start watcher error."); sendMsgToJava(env, "start watcher error."); return FALSE; }
void startWatcher(JNIEnv* pEnv, StoreWatcher* pWatcher, Store* pStore, jobject pStoreFront) { // Erases the StoreWatcher structure. memset(pWatcher, 0, sizeof(StoreWatcher)); pWatcher->mState = STATE_OK; pWatcher->mStore = pStore; // Caches the VM. if ((*pEnv)->GetJavaVM(pEnv, &pWatcher->mJavaVM) != JNI_OK) { goto ERROR; } // Caches classes. pWatcher->ClassStore = (*pEnv)->FindClass(pEnv, "com/congnt/ndkguide/Store"); makeGlobalRef(pEnv, &pWatcher->ClassStore); if (pWatcher->ClassStore == NULL) goto ERROR; pWatcher->ClassColor = (*pEnv)->FindClass(pEnv, "com/congnt/ndkguide/Color"); makeGlobalRef(pEnv, &pWatcher->ClassColor); if (pWatcher->ClassColor == NULL) goto ERROR; // Caches Java methods. pWatcher->MethodOnAlertInt = (*pEnv)->GetMethodID(pEnv, pWatcher->ClassStore, "onAlert", "(I)V"); if (pWatcher->MethodOnAlertInt == NULL) goto ERROR; pWatcher->MethodOnAlertString = (*pEnv)->GetMethodID(pEnv, pWatcher->ClassStore, "onAlert", "(Ljava/lang/String;)V"); if (pWatcher->MethodOnAlertString == NULL) goto ERROR; pWatcher->MethodOnAlertColor = (*pEnv)->GetMethodID(pEnv, pWatcher->ClassStore, "onAlert", "(Lcom/packtpub/Color;)V"); if (pWatcher->MethodOnAlertColor == NULL) goto ERROR; pWatcher->MethodColorEquals = (*pEnv)->GetMethodID(pEnv, pWatcher->ClassColor, "equals", "(Ljava/lang/Object;)Z"); if (pWatcher->MethodColorEquals == NULL) goto ERROR; jmethodID ConstructorColor = (*pEnv)->GetMethodID(pEnv, pWatcher->ClassColor, "<init>", "(Ljava/lang/String;)V"); if (ConstructorColor == NULL) goto ERROR; // Caches objects. pWatcher->mStoreFront = (*pEnv)->NewGlobalRef(pEnv, pStoreFront); if (pWatcher->mStoreFront == NULL) goto ERROR; // Initializes and launches the native thread. For simplicity // purpose, error results are not checked (but we should...). pthread_attr_t lAttributes; int lError = pthread_attr_init(&lAttributes); if (lError) goto ERROR; lError = pthread_create(&pWatcher->mThread, &lAttributes, runWatcher, pWatcher); if (lError) goto ERROR; // Creates a new white color and keeps a global reference. jstring lColor = (*pEnv)->NewStringUTF(pEnv, "white"); if (lColor == NULL) goto ERROR; pWatcher->mColor = (*pEnv)->NewObject(pEnv, pWatcher->ClassColor, ConstructorColor, lColor); makeGlobalRef(pEnv, &pWatcher->mColor); if (pWatcher->mColor == NULL) goto ERROR; return; ERROR: stopWatcher(pEnv, pWatcher); return; }
/*===================================================================*/ BOOL InfoNES_CreateContext(JNIEnv *pEnv, NES_CONTEXT *pNesContext, jobject refNesSimu, jobject refBitmap) { if( 0 == pEnv || 0 == pNesContext ) { LOGV("InfoNES_CreateContext failed 1"); return 0; } // Caches JavaVM. if( ( 0 == pNesContext->pJavaVM ) && ((*pEnv)->GetJavaVM(pEnv, &(pNesContext->pJavaVM)) != JNI_OK) ) { LOGV("InfoNES_CreateContext failed 2"); return 0; } // caches classNesSimu if( 0 == pNesContext->classNesSimu ) { jclass clsNesSimu = (*pEnv)->FindClass(pEnv, "com/falcon/nesSimon/NesSimu"); LOGV("InfoNES_CreateContext\n"); pNesContext->classNesSimu = makeGlobalRef(pEnv, clsNesSimu); if( 0 == pNesContext->classNesSimu ) { LOGV("InfoNES_CreateContext failed 3"); return 0; } } if( 0 != refNesSimu && (JNI_TRUE != (*pEnv)->IsSameObject(pEnv, pNesContext->objNesSimu, refNesSimu ))) { pNesContext->objNesSimu = makeGlobalRef(pEnv, refNesSimu); if( 0 == pNesContext->objNesSimu ) { LOGV("InfoNES_CreateContext failed 4"); return 0; } } if( 0 != refBitmap && (JNI_TRUE != (*pEnv)->IsSameObject(pEnv, pNesContext->objBitmap, refBitmap ))) { pNesContext->objBitmap = makeGlobalRef(pEnv, refBitmap); if( 0 == pNesContext->objBitmap ) { LOGV("InfoNES_CreateContext failed 5"); return 0; } } if( 0 == pNesContext->methodUpdateView ) { pNesContext->methodUpdateView = (*pEnv)->GetMethodID(pEnv, pNesContext->classNesSimu, "UpdateView", "()V"); if( 0 == pNesContext->methodUpdateView ) { LOGV("InfoNES_CreateContext failed 6"); return 0; } } NES_MUTEX_CREATE( WaitFlagCriticalSection ); NES_MUTEX_CREATE( PauseFlagCriticalSection ); NES_SEM_INIT(pNesContext->sem, 0); { int sem_val; sem_getvalue(&(pNesContext->sem), &sem_val); LOGV("InfoNES_CreateContext success, sem = %d", sem_val); } return 1; }