void Java_org_videolan_libvlc_LibVLC_nativeDestroy(JNIEnv *env, jobject thiz) { destroy_native_crash_handler(env); releaseMediaPlayer(env, thiz); jlong libVlcInstance = getLong(env, thiz, "mLibVlcInstance"); if (!libVlcInstance) return; // Already destroyed libvlc_instance_t *instance = (libvlc_instance_t*) (intptr_t) libVlcInstance; libvlc_log_unset(instance); libvlc_release(instance); setLong(env, thiz, "mLibVlcInstance", 0); }
void Java_org_videolan_libvlc_LibVLC_playMRL(JNIEnv *env, jobject thiz, jlong instance, jstring mrl, jobjectArray mediaOptions) { /* Release previous media player, if any */ releaseMediaPlayer(env, thiz); /* Create a media player playing environment */ libvlc_media_player_t *mp = libvlc_media_player_new((libvlc_instance_t*)(intptr_t)instance); libvlc_media_player_set_video_title_display(mp, libvlc_position_disable, 0); jobject myJavaLibVLC = (*env)->NewGlobalRef(env, thiz); //if AOUT_AUDIOTRACK_JAVA, we use amem jclass cls = (*env)->GetObjectClass(env, thiz); jmethodID methodId = (*env)->GetMethodID(env, cls, "getAout", "()I"); if ( (*env)->CallIntMethod(env, thiz, methodId) == AOUT_AUDIOTRACK_JAVA ) { libvlc_audio_set_callbacks(mp, aout_play, aout_pause, NULL, NULL, NULL, (void*) myJavaLibVLC); libvlc_audio_set_format_callbacks(mp, aout_open, aout_close); } /* Connect the event manager */ libvlc_event_manager_t *ev = libvlc_media_player_event_manager(mp); static const libvlc_event_type_t mp_events[] = { libvlc_MediaPlayerPlaying, libvlc_MediaPlayerPaused, libvlc_MediaPlayerEndReached, libvlc_MediaPlayerStopped, libvlc_MediaPlayerVout, libvlc_MediaPlayerPositionChanged, libvlc_MediaPlayerEncounteredError }; for(int i = 0; i < (sizeof(mp_events) / sizeof(*mp_events)); i++) libvlc_event_attach(ev, mp_events[i], vlc_event_callback, myVm); /* Keep a pointer to this media player */ setLong(env, thiz, "mInternalMediaPlayerInstance", (jlong)(intptr_t)mp); cls = (*env)->GetObjectClass(env, thiz); jmethodID methodID = (*env)->GetMethodID(env, cls, "applyEqualizer", "()V"); (*env)->CallVoidMethod(env, thiz, methodID); const char* p_mrl = (*env)->GetStringUTFChars(env, mrl, 0); libvlc_media_t* p_md = libvlc_media_new_location((libvlc_instance_t*)(intptr_t)instance, p_mrl); /* media options */ if (mediaOptions != NULL) { int stringCount = (*env)->GetArrayLength(env, mediaOptions); for(int i = 0; i < stringCount; i++) { jstring option = (jstring)(*env)->GetObjectArrayElement(env, mediaOptions, i); const char* p_st = (*env)->GetStringUTFChars(env, option, 0); libvlc_media_add_option(p_md, p_st); // option (*env)->ReleaseStringUTFChars(env, option, p_st); } } (*env)->ReleaseStringUTFChars(env, mrl, p_mrl); /* Connect the media event manager. */ libvlc_event_manager_t *ev_media = libvlc_media_event_manager(p_md); static const libvlc_event_type_t mp_media_events[] = { libvlc_MediaParsedChanged }; for(int i = 0; i < (sizeof(mp_media_events) / sizeof(*mp_media_events)); i++) libvlc_event_attach(ev_media, mp_media_events[i], vlc_event_callback, myVm); libvlc_media_player_set_media(mp, p_md); libvlc_media_player_play(mp); }