From eefa7551a1c2fd3aebb9a5e8149297cc63034949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 9 Oct 2014 11:40:38 +0200 Subject: [PATCH] Fix the listener of linphone player --- coreapi/linphonecore_jni.cc | 86 +++++++++---------- .../org/linphone/core/LinphonePlayer.java | 2 +- .../org/linphone/core/LinphonePlayerImpl.java | 6 +- 3 files changed, 44 insertions(+), 50 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index ff6a92102..a676249ee 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -5211,99 +5211,96 @@ JNIEXPORT jstring JNICALL Java_org_linphone_core_ErrorInfoImpl_getDetails(JNIEnv #endif /* Linphone Player */ -class LinphonePlayerData { -public: - LinphonePlayerData(jobject listener, jobject jLinphonePlayer) : - mListener(listener), - mJLinphonePlayer(jLinphonePlayer) {} +struct LinphonePlayerData { + LinphonePlayerData(JNIEnv *env, jobject listener, jobject jLinphonePlayer) : + mListener(env->NewGlobalRef(listener)), + mJLinphonePlayer(env->NewGlobalRef(jLinphonePlayer)) + { + mListenerClass = (jclass)env->NewGlobalRef(env->GetObjectClass(listener)); + mEndOfFileMethodID = env->GetMethodID(mListenerClass, "endOfFile", "(Lorg/linphone/core/LinphonePlayer;)V"); + if(mEndOfFileMethodID == NULL) { + ms_error("Could not get endOfFile method ID"); + env->ExceptionClear(); + } + } + + ~LinphonePlayerData() { + JNIEnv *env; + jvm->AttachCurrentThread(&env, NULL); + env->DeleteGlobalRef(mListener); + env->DeleteGlobalRef(mListenerClass); + env->DeleteGlobalRef(mJLinphonePlayer); + } jobject mListener; + jclass mListenerClass; jobject mJLinphonePlayer; - - static jmethodID endOfFileMethodID; - - static void init(JNIEnv *env) { - jclass listenerClass = env->FindClass("org/linphone/core/LinphonePlayer#Listener"); - endOfFileMethodID = env->GetMethodID(listenerClass, "endOfFile", "(Lorg/linphone/core/LinphonePlayer;)V"); - } + jmethodID mEndOfFileMethodID; }; -jmethodID LinphonePlayerData::endOfFileMethodID = NULL; - static void _eof_callback(LinphonePlayer *player, void *user_data) { JNIEnv *env; LinphonePlayerData *player_data = (LinphonePlayerData *)user_data; jvm->AttachCurrentThread(&env, NULL); - if(LinphonePlayerData::endOfFileMethodID == NULL) { - LinphonePlayerData::init(env); - } - env->CallVoidMethod(player_data->mListener, LinphonePlayerData::endOfFileMethodID, player_data->mJLinphonePlayer); - jvm->DetachCurrentThread(); + env->CallVoidMethod(player_data->mListener, player_data->mEndOfFileMethodID, player_data->mJLinphonePlayer); } -JNIEXPORT jint JNICALL Java_org_linphone_core_LinphonePlayer_open(JNIEnv *env, jobject jPlayer, jlong ptr, jstring filename, jobject listener) { +extern "C" jint Java_org_linphone_core_LinphonePlayerImpl_open(JNIEnv *env, jobject jPlayer, jlong ptr, jstring filename, jobject listener) { LinphonePlayerData *data = NULL; LinphonePlayerEofCallback cb = NULL; if(listener) { - listener = env->NewGlobalRef(listener); - jPlayer = env->NewGlobalRef(jPlayer); - data = new LinphonePlayerData(listener, jPlayer); + data = new LinphonePlayerData(env, listener, jPlayer); cb = _eof_callback; } - if(linphone_player_open((LinphonePlayer *)ptr, env->GetStringUTFChars(filename, NULL), cb, &data) == -1) { - if(data) { - delete data; - env->DeleteGlobalRef(listener); - env->DeleteGlobalRef(jPlayer); - } + if(linphone_player_open((LinphonePlayer *)ptr, env->GetStringUTFChars(filename, NULL), cb, data) == -1) { + if(data) delete data; return -1; } return 0; } -JNIEXPORT jint JNICALL Java_org_linphone_core_LinphonePlayer_start(JNIEnv *env, jobject jobj, jlong ptr) { +extern "C" jint Java_org_linphone_core_LinphonePlayerImpl_start(JNIEnv *env, jobject jobj, jlong ptr) { + LinphonePlayerData *player_data = (LinphonePlayerData *)((LinphonePlayer *)ptr)->user_data; return (jint)linphone_player_start((LinphonePlayer *)ptr); } -JNIEXPORT jint JNICALL Java_org_linphone_core_LinphonePlayer_pause(JNIEnv *env, jobject jobj, jlong ptr) { +extern "C" jint Java_org_linphone_core_LinphonePlayerImpl_pause(JNIEnv *env, jobject jobj, jlong ptr) { return (jint)linphone_player_pause((LinphonePlayer *)ptr); } -JNIEXPORT jint JNICALL Java_org_linphone_core_LinphonePlayer_seek(JNIEnv *env, jobject jobj, jlong ptr, jint timeMs) { +extern "C" jint Java_org_linphone_core_LinphonePlayerImpl_seek(JNIEnv *env, jobject jobj, jlong ptr, jint timeMs) { return (jint)linphone_player_seek((LinphonePlayer *)ptr, timeMs); } -JNIEXPORT jint JNICALL Java_org_linphone_core_LinphonePlayer_getState(JNIEnv *env, jobject jobj, jlong ptr) { +extern "C" jint Java_org_linphone_core_LinphonePlayerImpl_getState(JNIEnv *env, jobject jobj, jlong ptr) { return (jint)linphone_player_get_state((LinphonePlayer *)ptr); } -JNIEXPORT jint JNICALL Java_org_linphone_core_LinphonePlayer_getDuration(JNIEnv *env, jobject jobj, jlong ptr) { +extern "C" jint Java_org_linphone_core_LinphonePlayerImpl_getDuration(JNIEnv *env, jobject jobj, jlong ptr) { return (jint)linphone_player_get_duration((LinphonePlayer *)ptr); } -JNIEXPORT jint JNICALL Java_org_linphone_core_LinphonePlayer_getCurrentPosition(JNIEnv *env, jobject jobj, jlong ptr) { +extern "C" jint Java_org_linphone_core_LinphonePlayerImpl_getCurrentPosition(JNIEnv *env, jobject jobj, jlong ptr) { return (jint)linphone_player_get_current_position((LinphonePlayer *)ptr); } -JNIEXPORT void JNICALL Java_org_linphone_core_LinphonePlayer_close(JNIEnv *env, jobject playerPtr, jlong ptr) { +extern "C" void Java_org_linphone_core_LinphonePlayerImpl_close(JNIEnv *env, jobject playerPtr, jlong ptr) { LinphonePlayer *player = (LinphonePlayer *)ptr; if(player->user_data) { LinphonePlayerData *data = (LinphonePlayerData *)player->user_data; - env->DeleteGlobalRef(data->mListener); - env->DeleteGlobalRef(data->mJLinphonePlayer); - delete data; + if(data) delete data; player->user_data = NULL; } linphone_player_close(player); } -JNIEXPORT jlong JNICALL Java_org_linphone_core_LinphoneCore_createPlayer(JNIEnv *env, jobject jobj, jlong ptr) { +extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_createPlayer(JNIEnv *env, jobject jobj, jlong ptr) { MSSndCard *snd_card = ms_snd_card_manager_get_default_playback_card(ms_snd_card_manager_get()); if(snd_card == NULL) { ms_error("No default playback sound card found"); return 0; } - LinphonePlayer *player = linphone_core_create_file_player((LinphoneCore *)ptr, snd_card, NULL); + LinphonePlayer *player = linphone_core_create_file_player((LinphoneCore *)ptr, snd_card, "MSAndroidDisplay"); if(player == NULL) { ms_error("Fails to create a player"); return 0; @@ -5312,13 +5309,10 @@ JNIEXPORT jlong JNICALL Java_org_linphone_core_LinphoneCore_createPlayer(JNIEnv } } -JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneCore_destroyPlayer(JNIEnv *env, jobject jobj, jlong playerPtr) { +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_destroyPlayer(JNIEnv *env, jobject jobj, jlong playerPtr) { LinphonePlayer *player = (LinphonePlayer *)playerPtr; if(player->user_data) { - LinphonePlayerData *data = (LinphonePlayerData *)player->user_data; - env->DeleteGlobalRef(data->mListener); - env->DeleteGlobalRef(data->mJLinphonePlayer); - delete data; + delete (LinphonePlayerData *)player->user_data;; } linphone_file_player_destroy(player); } diff --git a/java/common/org/linphone/core/LinphonePlayer.java b/java/common/org/linphone/core/LinphonePlayer.java index 9a862d3b3..faba92d5d 100644 --- a/java/common/org/linphone/core/LinphonePlayer.java +++ b/java/common/org/linphone/core/LinphonePlayer.java @@ -49,7 +49,7 @@ public interface LinphonePlayer { * @param filename Name of the file to open * @return 0 on success, -1 on failure */ - public int open(final String filename, Listener listener); + public int open(String filename, Listener listener); /** * Start playback diff --git a/java/impl/org/linphone/core/LinphonePlayerImpl.java b/java/impl/org/linphone/core/LinphonePlayerImpl.java index eb6c18c71..08168e093 100644 --- a/java/impl/org/linphone/core/LinphonePlayerImpl.java +++ b/java/impl/org/linphone/core/LinphonePlayerImpl.java @@ -14,10 +14,10 @@ public class LinphonePlayerImpl implements LinphonePlayer { this.nativePtr = nativePtr; } - private native int open(long nativePtr, final String filename, Listener listener, LinphonePlayer player); + private native int open(long nativePtr, String filename, Listener listener); @Override - public synchronized int open(final String filename, Listener listener) { - return open(nativePtr, filename, listener, this); + public synchronized int open(String filename, Listener listener) { + return open(nativePtr, filename, listener); } private native int start(long nativePtr);