VOID * CMTimer_Imp::TimeProc(VOID* pData) { CMTimer_Imp *pTimer = (CMTimer_Imp*)pData; struct timeval delay; delay.tv_sec = 0; delay.tv_usec = pTimer->m_nWaitingInterval * 1000; select(0, NULL, NULL, NULL, &delay); pTimer->m_bExitThread = FALSE; pTimer->m_Pthread_t = pthread_self(); JNIEnv*env; GetJavaVM()->AttachCurrentThread((JNIEnv**)&env, NULL); if(pTimer) { while(!pTimer->m_bExitThread) { if(pTimer->m_bRuning && pTimer->m_pTimer) { pTimer->m_bRuning = FALSE; pTimer->m_pTimer->m_pNotify->OnTimer(*pTimer->m_pTimer); } else { struct timeval delay; delay.tv_sec = 0; delay.tv_usec = pTimer->m_nWaitingInterval * 1000; select(0, NULL, NULL, NULL, &delay); } } } GetJavaVM()->DetachCurrentThread(); pTimer->m_Pthread_t = 0; }
void unloadSensorController(MPEGVSensorContext *rc) { if ( rc->isAttached ) { (*rc->env)->PopLocalFrame(rc->env, NULL); (*GetJavaVM())->DetachCurrentThread(GetJavaVM()); rc->isAttached = 0; } rc->env = NULL; }
//---------------------------------------------------------------------- // Called by the audio thread static void WAV_Shutdown(GF_AudioOutput *dr) { DroidContext *ctx = (DroidContext *)dr->opaque; JNIEnv* env = ctx->env; (*env)->CallNonvirtualVoidMethod(env, mtrack, cAudioTrack, mStop); (*env)->CallNonvirtualVoidMethod(env, mtrack, cAudioTrack, mRelease); (*env)->PopLocalFrame(env, NULL); (*GetJavaVM())->DetachCurrentThread(GetJavaVM()); }
/* Called by the audio thread */ static GF_Err WAV_ConfigureOutput(GF_AudioOutput *dr, u32 *SampleRate, u32 *NbChannels, u32 *nbBitsPerSample, u32 channel_cfg) { JNIEnv* env = NULL; u32 i; DroidContext *ctx = (DroidContext *)dr->opaque; LOGI("[Android Audio] Configure Output for %u channels...", *NbChannels); if (!ctx) return GF_BAD_PARAM; ctx->sampleRateInHz = *SampleRate; ctx->channelConfig = (*NbChannels == 1) ? CHANNEL_CONFIGURATION_MONO : CHANNEL_CONFIGURATION_STEREO; //AudioFormat.CHANNEL_CONFIGURATION_MONO ctx->audioFormat = (*nbBitsPerSample == 8)? ENCODING_PCM_8BIT : ENCODING_PCM_16BIT; //AudioFormat.ENCODING_PCM_16BIT // Get the java environment in the new thread (*GetJavaVM())->AttachCurrentThread(GetJavaVM(), &env, NULL); ctx->env = env; LOGV("[Android Audio] SampleRate : %d",ctx->sampleRateInHz); LOGV("[Android Audio] BitPerSample : %d", *nbBitsPerSample); (*env)->PushLocalFrame(env, 2); ctx->num_buffers = 1; ctx->mbufferSizeInBytes = (*env)->CallStaticIntMethod(env, cAudioTrack, mGetMinBufferSize, ctx->sampleRateInHz, ctx->channelConfig, ctx->audioFormat); i = 1; if ( ctx->channelConfig == CHANNEL_CONFIGURATION_STEREO ) i *= 2; if ( ctx->audioFormat == ENCODING_PCM_16BIT ) i *= 2; ctx->total_length_ms = 1000 * ctx->num_buffers * ctx->mbufferSizeInBytes / i / ctx->sampleRateInHz; /*initial delay is full buffer size*/ ctx->delay = ctx->total_length_ms; mtrack = (*env)->NewObject(env, cAudioTrack, mAudioTrack, STREAM_MUSIC, ctx->sampleRateInHz, ctx->channelConfig, ctx->audioFormat, ctx->mbufferSizeInBytes, MODE_STREAM); //AudioTrack.MODE_STREAM if (mtrack){ mtrack = (*env)->NewGlobalRef(env, mtrack); ctx->mtrack = mtrack; (*env)->CallNonvirtualVoidMethod(env, mtrack, cAudioTrack, mPlay); } else { LOGV("[Android Audio] mtrack = %p", mtrack); return GF_NOT_SUPPORTED; } ctx->buff = (*env)->NewByteArray(env, ctx->mbufferSizeInBytes); LOGV("[Android Audio] ConfigureOutput DONE.", *NbChannels); return GF_OK; }
JD_IMETHODIMP JavaPluginFactory5::CreateInstance(ISupports *aOuter, const JDIID & aIID, void **result) { trace("JavaPluginFactory5:CreateInstance\n"); if (result == NULL) { plugin_error("NULL result in create instance"); return JD_ERROR_NULL_POINTER; } *result = NULL; if (aOuter != NULL) { plugin_error("NO_AGGREGATION in create instance!"); return JD_ERROR_NO_AGGREGATION; } if (! (aIID.Equals(jIPluginInstanceIID) || aIID.Equals(jISupportsIID))) return JD_NOINTERFACE; /* Startup the JVM if it is not already running */ JavaVM5* vm = GetJavaVM(); /* Create a new instance and refcount it */ JavaPluginInstance5 * pluginInstance = new JavaPluginInstance5(this); *result = (IPluginInstance *) pluginInstance; pluginInstance->AddRef(); UNUSED(vm); return JD_OK; }
/* Make a call to return the plugin instance for an object */ jobject JavaPluginFactory5::GetJavaObjectForInstance(int plugin_number) { /* Get the vm, making sure it is started if necessary */ JavaVM5* jvm = GetJavaVM(); return jvm->GetJavaObjectForInstance(plugin_number); }
void JniLogSystemCallback::operator()(AdblockPlus::LogSystem::LogLevel logLevel, const std::string& message, const std::string& source) { JNIEnvAcquire env(GetJavaVM()); jmethodID method = env->GetMethodID( *JniLocalReference<jclass>(*env, env->GetObjectClass(GetCallbackObject())), "logCallback", "(" TYP("LogSystem$LogLevel") "Ljava/lang/String;Ljava/lang/String;)V"); // TODO: Set log level from Java and handle it here (to reduce C++->Java calls) if (method) { const char* enumName = 0; switch (logLevel) { default: case AdblockPlus::LogSystem::LOG_LEVEL_TRACE: enumName = "TRACE"; break; case AdblockPlus::LogSystem::LOG_LEVEL_LOG: enumName = "LOG"; break; case AdblockPlus::LogSystem::LOG_LEVEL_INFO: enumName = "INFO"; break; case AdblockPlus::LogSystem::LOG_LEVEL_WARN: enumName = "WARN"; break; case AdblockPlus::LogSystem::LOG_LEVEL_ERROR: enumName = "ERROR"; break; } jclass enumClass = logLevelClass->Get(); if (enumClass) { jfieldID enumField = env->GetStaticFieldID(enumClass, enumName, TYP("LogSystem$LogLevel")); JniLocalReference<jobject> jLogLevel(*env, env->GetStaticObjectField(enumClass, enumField)); JniLocalReference<jstring> jMessage(*env, env->NewStringUTF(message.c_str())); JniLocalReference<jstring> jSource(*env, env->NewStringUTF(source.c_str())); env->CallVoidMethod(GetCallbackObject(), method, *jLogLevel, *jMessage, *jSource); } CheckAndLogJavaException(*env); } }
void loadSensorControler(MPEGVSensorContext *rc) { JNIEnv* env = NULL; jint res = 0; // Here we can be in a thread res = (*GetJavaVM())->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_2); if ( res == JNI_EDETACHED ) { GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[MPEG-V_IN] The current thread is not attached to the VM, assuming native thread\n")); if ( res = (*GetJavaVM())->AttachCurrentThread(GetJavaVM(), &env, NULL) ) { GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[MPEG-V_IN] Attach current thread failed: %d\n", res)); return; } rc->isAttached = 1; (*env)->PushLocalFrame(env, 2); } else if ( res == JNI_EVERSION ) { GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[MPEG-V_IN] The specified version is not supported\n")); return; } rc->env = env; rc->sensCtrlClass = sensCtrlClass; rc->cid = cid; rc->startSensor = startSensor; rc->stopSensor = stopSensor; // Create the sensor object in the thread rc->sensCtrlObj = (*rc->env)->NewObject(rc->env, rc->sensCtrlClass, rc->cid); if (rc->sensCtrlObj == 0) { GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[MPEG-V_IN] Cannot create MPEGVSensor object\n")); return; } }
JD_IMETHODIMP JavaPluginFactory5::ShowJavaConsole(void) { JavaVM5 *vm = GetJavaVM(); CWriteBuffer wb; trace("JavaPluginFactory5:ShowJavaConsole"); wb.putInt(JAVA_PLUGIN_CONSOLE_SHOW); SendRequest(wb, FALSE); UNUSED(vm); return JD_OK; }
void JniEventCallback::Callback(AdblockPlus::JsValueList& params) { JNIEnvAcquire env(GetJavaVM()); jclass clazz = env->GetObjectClass(GetCallbackObject()); jmethodID method = env->GetMethodID(clazz, "eventCallback", "(Ljava/util/List;)V"); if (method) { jobject jsList = JniJsValueListToArrayList(*env, params); env->CallVoidMethod(GetCallbackObject(), method, jsList); } }
void JniEventCallback::Callback(AdblockPlus::JsValueList&& params) { JNIEnvAcquire env(GetJavaVM()); jmethodID method = env->GetMethodID( *JniLocalReference<jclass>(*env, env->GetObjectClass(GetCallbackObject())), "eventCallback", "(Ljava/util/List;)V"); if (method) { jobject jsList = JniJsValueListToArrayList(*env, std::move(params)); env->CallVoidMethod(GetCallbackObject(), method, jsList); } }
void JniUpdaterCallback::Callback(const std::string& arg) { JNIEnvAcquire env(GetJavaVM()); jclass clazz = env->GetObjectClass(GetCallbackObject()); jmethodID method = env->GetMethodID(clazz, "updateCallback", "(Ljava/lang/String;)V"); if (method) { jstring jArg = env->NewStringUTF(arg.c_str()); env->CallVoidMethod(GetCallbackObject(), method, jArg); } CheckAndLogJavaException(*env); }
void JniFilterChangeCallback::Callback(const std::string& arg, const AdblockPlus::JsValuePtr jsValue) { JNIEnvAcquire env(GetJavaVM()); jclass clazz = env->GetObjectClass(GetCallbackObject()); jmethodID method = env->GetMethodID(clazz, "filterChangeCallback", "(Ljava/lang/String;" TYP("JsValue") ")V"); if (method) { jstring jArg = env->NewStringUTF(arg.c_str()); jobject jJsValue = NewJniJsValue(*env, jsValue, jsValueClass->Get()); env->CallVoidMethod(GetCallbackObject(), method, jArg, jJsValue); } CheckAndLogJavaException(*env); }
void JniUpdateCheckDoneCallback::Callback(const std::string& arg) { JNIEnvAcquire env(GetJavaVM()); jmethodID method = env->GetMethodID( *JniLocalReference<jclass>(*env, env->GetObjectClass(GetCallbackObject())), "updateCheckDoneCallback", "(Ljava/lang/String;)V"); if (method) { JniLocalReference<jstring> jArg(*env, env->NewStringUTF(arg.c_str())); env->CallVoidMethod(GetCallbackObject(), method, *jArg); } CheckAndLogJavaException(*env); }
JD_IMETHODIMP JavaPluginFactory5::CreateSecureEnv(JNIEnv* proxy_env, ISecureEnv* *result) { trace("JavaPluginFactory5:CreateSecureEnv\n"); if (result != NULL) *result = NULL; // This is left here to make it easy to turn off live connect support // should something prove to be out of wack! (Just un comment) // return JD_ERROR_FAILURE; JavaVM5 * vm = GetJavaVM(); if(!(vm->GetJVMEnabled())) return JD_ERROR_FAILURE; RemoteJNIEnv* remote_env = javaVM->CreateRemoteJNIEnv(proxy_env); return CSecureJNIEnv::Create(NULL, remote_env, jISupportsIID, (void**) result); }
void CMUpdateDataListener::OnUpdateDataProgress(void* UserData, int nPercent) { JNIEnv *env = NULL; int status = GetJavaVM()->GetEnv((void **) &env, JNI_VERSION_1_4); if(status < 0) { CM_ERR("CMUpdateDataListener OnUpdateDataProgress:failed to get JNI environment"); return; } if (env) { callback_cookie* pCookie = (callback_cookie *)UserData; env->CallStaticVoidMethod( pCookie->info_class, mFuncID, pCookie->ref, 1, nPercent, 0); if (env->ExceptionCheck()) { env->ExceptionDescribe(); env->ExceptionClear(); } } }
void CMSimpleResultListener::OnRequestFinish(void* UserData, int Result) { JNIEnv *env = NULL; int status = GetJavaVM()->GetEnv((void **) &env, JNI_VERSION_1_4); if(status < 0) { CM_ERR("CMSimpleResultListener OnRequestFinish:failed to get JNI environment"); return; } if (env) { callback_cookie* pCookie = (callback_cookie *)UserData; env->CallStaticVoidMethod( pCookie->info_class, mFuncID, pCookie->ref, 3, Result, 0); if (env->ExceptionCheck()) { env->ExceptionDescribe(); env->ExceptionClear(); } } }
CMPath::CMPath(DEF_TYPE nDefType) { switch(nDefType) { /* 该功能放到CMGlobal中 case CONF_PATH://用户配置文件路径 { m_sPath = CMPath(DATA_PATH).String(); CMString sID; if(CMGlobal::TheOne().GetSessionID(sID) && !(CMSettings::GetInstance().m_sName.IsEmpty())) AddDir(CMSettings::GetInstance().m_sName + L"/"); break; }*/ case SYS_CONF_PATH://系统配置文件路径 case DATA_PATH://数据路径 { /* char buf[260]; memset(buf,0,260); int ret = readlink("proc/self/exe", buf, 260); if(ret < 0 || ret >= 1024) break; for(INT32 i=strlen(buf)-1;i>0;i--) { if(buf[i]=='/') { buf[i+1]=L'\0'; break; } }*/ //CM_ERRP("DATA_PATH%s",buf); JNIEnv* env ; if (GetJavaVM()->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) return ; jmethodID method = env->GetStaticMethodID(GetGlobalCls(), "getInstance", "()Lcom/wunding/mlplayer/CMGlobal;"); if(!method) return; jobject obj = (jobject)env->CallStaticObjectMethod(GetGlobalCls(), method); if(!obj) return; method = env->GetMethodID(GetGlobalCls(), "GetDataDir", "()Ljava/lang/String;"); const char * buf = NULL; if(method) { jstring jstr = (jstring)env->CallObjectMethod(obj, method); if(jstr) { buf = env->GetStringUTFChars(jstr, NULL); m_sPath = buf; if(buf) env->ReleaseStringUTFChars(jstr, buf); } } m_sPath += L"/"; //CM_ERRP("DATA_PATH:%s",(const char*)m_sPath); break; } case TEMP_PATH: { m_sPath = CMPath(DATA_PATH).String(); AddDir(L"tmp/"); break; } case DOWNLOAD_PATH: { m_sPath = CMPath(DATA_PATH).String(); if(!m_sPath.IsEmpty()) AddDir(L"dld/"); break; // m_sPath = CMPath(CARD_PATH).String(); // if(!m_sPath.IsEmpty()){ // AddDir(L"wunding_ulp/"); // } // break; } case DOWNLOAD_OLD: { m_sPath = CMPath(CARD_PATH).String()+L"wunding_ulp/"; break; } case UNZIP_PATH: //下载课件解压缩后目录 { m_sPath = CMPath::CMPath(DOWNLOAD_PATH).String(); if (!m_sPath.IsEmpty()) { AddDir(L"download/"); } break; } case APP_PATH: { m_sPath = CMPath(DATA_PATH).String(); break; } case CARD_PATH://存储卡根目录 { JNIEnv* env ; if (GetJavaVM()->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) return ; jclass cls = (jclass)env->FindClass("android/os/Environment"); if(!cls) return; jmethodID method = env->GetStaticMethodID(cls, "getExternalStorageDirectory", "()Ljava/io/File;"); if(!method) return; jobject obj = (jobject)env->CallStaticObjectMethod(cls, method); if(!obj) return; cls = (jclass)env->FindClass("java/io/File"); if(!cls) return; method = env->GetMethodID(cls, "getPath", "()Ljava/lang/String;"); if(!method) return; const char * buf = NULL; if(method) { jstring jstr = (jstring)env->CallObjectMethod(obj, method); if(jstr) { buf = env->GetStringUTFChars(jstr, NULL); m_sPath = buf; if(buf) env->ReleaseStringUTFChars(jstr, buf); } } m_sPath += L"/"; break; } case WSYS_PATH://系统盘根目录 { m_sPath = L"/"; break; } default: break; } }