提交 775b5e79 编写于 作者: Z Zhang Rui

jni: NewGlobalRef for FindClass

上级 2ebb6a85
...@@ -280,7 +280,7 @@ IjkMediaPlayer_native_finalize(JNIEnv *env, jobject thiz) ...@@ -280,7 +280,7 @@ IjkMediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
inline static void post_event(JNIEnv *env, jobject weak_this, int what, int arg1, int arg2) inline static void post_event(JNIEnv *env, jobject weak_this, int what, int arg1, int arg2)
{ {
(*env)->CallStaticVoidMethod(env, g_clazz.postEventFromNative, weak_this, what, arg1, arg2, NULL); (*env)->CallStaticVoidMethod(env, g_clazz.clazz, g_clazz.postEventFromNative, weak_this, what, arg1, arg2, NULL);
} }
static void message_loop_n(JNIEnv *env, IjkMediaPlayer *mp) static void message_loop_n(JNIEnv *env, IjkMediaPlayer *mp)
...@@ -393,6 +393,7 @@ static JNINativeMethod g_methods[] = { ...@@ -393,6 +393,7 @@ static JNINativeMethod g_methods[] = {
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
{ {
JNIEnv* env = NULL; JNIEnv* env = NULL;
jclass clazz;
g_jvm = vm; g_jvm = vm;
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
...@@ -402,16 +403,20 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) ...@@ -402,16 +403,20 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
pthread_mutex_init(&g_clazz.mutex, NULL); pthread_mutex_init(&g_clazz.mutex, NULL);
g_clazz.clazz = (*env)->FindClass(env, JNI_CLASS_IJKPLAYER); clazz = (*env)->FindClass(env, JNI_CLASS_IJKPLAYER);
JNI_CHECK_RET(g_clazz.clazz, env, NULL, NULL, -1); IJK_CHECK_RET(clazz, -1, "missing %s", JNI_CLASS_IJKPLAYER);
// FindClass returns LocalReference
g_clazz.clazz = (*env)->NewGlobalRef(env, clazz);
IJK_CHECK_RET(clazz, -1, "%s NewGlobalRef failed", JNI_CLASS_IJKPLAYER);
(*env)->RegisterNatives(env, g_clazz.clazz, g_methods, NELEM(g_methods)); (*env)->RegisterNatives(env, g_clazz.clazz, g_methods, NELEM(g_methods));
g_clazz.mNativeMediaPlayer = (*env)->GetFieldID(env, g_clazz.clazz, "mNativeMediaPlayer", "J"); g_clazz.mNativeMediaPlayer = (*env)->GetFieldID(env, g_clazz.clazz, "mNativeMediaPlayer", "J");
JNI_CHECK_RET(g_clazz.mNativeMediaPlayer, env, NULL, NULL, -1); IJK_CHECK_RET(g_clazz.mNativeMediaPlayer, -1, "missing mNativeMediaPlayer");
g_clazz.postEventFromNative = (*env)->GetStaticMethodID(env, g_clazz.clazz, "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V"); g_clazz.postEventFromNative = (*env)->GetStaticMethodID(env, g_clazz.clazz, "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V");
JNI_CHECK_RET(g_clazz.postEventFromNative, env, NULL, NULL, -1); IJK_CHECK_RET(g_clazz.postEventFromNative, -1, "missing postEventFromNative");
ijkmp_global_init(); ijkmp_global_init();
......
...@@ -110,40 +110,40 @@ typedef struct audio_track_fields_t { ...@@ -110,40 +110,40 @@ typedef struct audio_track_fields_t {
} audio_track_fields_t; } audio_track_fields_t;
static audio_track_fields_t g_clazz; static audio_track_fields_t g_clazz;
#define AT_CHECK_RET(condition__, retval__, ...) \
if (!(condition__)) { \
ALOGE(__VA_ARGS__); \
return (retval__); \
}
int sdl_audiotrack_global_init(JNIEnv *env) int sdl_audiotrack_global_init(JNIEnv *env)
{ {
g_clazz.clazz = (*env)->FindClass(env, "android.media.AudioTrack"); jclass clazz;
AT_CHECK_RET(g_clazz.clazz, -1, "missing AudioTrack");
clazz = (*env)->FindClass(env, "android/media/AudioTrack");
IJK_CHECK_RET(clazz, -1, "missing AudioTrack");
// FindClass returns LocalReference
g_clazz.clazz = (*env)->NewGlobalRef(env, clazz);
IJK_CHECK_RET(clazz, -1, "AudioTrack NewGlobalRef failed");
g_clazz.constructor = (*env)->GetMethodID(env, g_clazz.clazz, "<init>", "(IIIIII)V"); g_clazz.constructor = (*env)->GetMethodID(env, g_clazz.clazz, "<init>", "(IIIIII)V");
AT_CHECK_RET(g_clazz.constructor, -1, "missing AudioTrack.<init>"); IJK_CHECK_RET(g_clazz.constructor, -1, "missing AudioTrack.<init>");
g_clazz.getMinBufferSize = (*env)->GetStaticMethodID(env, g_clazz.clazz, "getMinBufferSize", "(III)V"); g_clazz.getMinBufferSize = (*env)->GetStaticMethodID(env, g_clazz.clazz, "getMinBufferSize", "(III)I");
AT_CHECK_RET(g_clazz.getMinBufferSize, -1, "missing AudioTrack.getMinBufferSize"); IJK_CHECK_RET(g_clazz.getMinBufferSize, -1, "missing AudioTrack.getMinBufferSize");
g_clazz.play = (*env)->GetMethodID(env, g_clazz.clazz, "play", "(V)V"); g_clazz.play = (*env)->GetMethodID(env, g_clazz.clazz, "play", "()V");
AT_CHECK_RET(g_clazz.play, -1, "missing AudioTrack.play"); IJK_CHECK_RET(g_clazz.play, -1, "missing AudioTrack.play");
g_clazz.pause = (*env)->GetMethodID(env, g_clazz.clazz, "pause", "(V)V"); g_clazz.pause = (*env)->GetMethodID(env, g_clazz.clazz, "pause", "()V");
AT_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.pause"); IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.pause");
g_clazz.flush = (*env)->GetMethodID(env, g_clazz.clazz, "flush", "(V)V"); g_clazz.flush = (*env)->GetMethodID(env, g_clazz.clazz, "flush", "()V");
JNI_CHECK_RET(g_clazz.flush, env, NULL, NULL, -1); IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.flush");
g_clazz.stop = (*env)->GetMethodID(env, g_clazz.clazz, "stop", "(V)V"); g_clazz.stop = (*env)->GetMethodID(env, g_clazz.clazz, "stop", "()V");
JNI_CHECK_RET(g_clazz.stop, env, NULL, NULL, -1); IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.stop");
g_clazz.release = (*env)->GetMethodID(env, g_clazz.clazz, "release", "(V)V"); g_clazz.release = (*env)->GetMethodID(env, g_clazz.clazz, "release", "()V");
JNI_CHECK_RET(g_clazz.release, env, NULL, NULL, -1); IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.release");
g_clazz.write_byte = (*env)->GetMethodID(env, g_clazz.clazz, "write", "([BII)V"); g_clazz.write_byte = (*env)->GetMethodID(env, g_clazz.clazz, "write", "([BII)I");
JNI_CHECK_RET(g_clazz.write_byte, env, NULL, NULL, -1); IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.write");
return 0; return 0;
} }
...@@ -205,8 +205,8 @@ SDL_AndroidAudioTrack *sdl_audiotrack_new_from_spec(JNIEnv *env, SDL_AndroidAudi ...@@ -205,8 +205,8 @@ SDL_AndroidAudioTrack *sdl_audiotrack_new_from_spec(JNIEnv *env, SDL_AndroidAudi
} }
jobject thiz = (*env)->NewObject(env, g_clazz.clazz, g_clazz.constructor, jobject thiz = (*env)->NewObject(env, g_clazz.clazz, g_clazz.constructor,
spec->stream_type, spec->sample_rate_in_hz, spec->channel_config, (int) spec->stream_type, (int) spec->sample_rate_in_hz, (int) spec->channel_config,
spec->audio_format, min_buffer_size, spec->mode); (int) spec->audio_format, (int) min_buffer_size, (int) spec->mode);
if (!thiz || (*env)->ExceptionCheck(env)) { if (!thiz || (*env)->ExceptionCheck(env)) {
ALOGE("sdl_audiotrack_new: NewObject: Exception:"); ALOGE("sdl_audiotrack_new: NewObject: Exception:");
if ((*env)->ExceptionCheck(env)) { if ((*env)->ExceptionCheck(env)) {
......
...@@ -23,7 +23,8 @@ ...@@ -23,7 +23,8 @@
#include "ijksdl_android_jni.h" #include "ijksdl_android_jni.h"
#include "../ijksdl_inc_internal.h" #include "ijksdl_inc_internal_android.h"
#include "android_audiotrack.h"
JavaVM *g_jvm; JavaVM *g_jvm;
...@@ -56,6 +57,7 @@ jint SDL_AndroidJni_DetachCurrentThread() ...@@ -56,6 +57,7 @@ jint SDL_AndroidJni_DetachCurrentThread()
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{ {
int retval;
JNIEnv* env = NULL; JNIEnv* env = NULL;
g_jvm = vm; g_jvm = vm;
...@@ -63,6 +65,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) ...@@ -63,6 +65,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
return -1; return -1;
} }
retval = sdl_audiotrack_global_init(env);
JNI_CHECK_RET(retval == 0, env, NULL, NULL, -1);
return JNI_VERSION_1_4; return JNI_VERSION_1_4;
} }
......
/*
* ijksdl_inc_internal_android.h
*
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
*
* This file is part of ijkPlayer.
*
* ijkPlayer is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* ijkPlayer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with ijkPlayer; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef IJKPLAYER__IJKSDL_INC_INTERNAL_ANDROID_H
#define IJKPLAYER__IJKSDL_INC_INTERNAL_ANDROID_H
#include <stdint.h>
#include "../ijksdl_inc_internal.h"
#include "ijkutil/ijkutil_android.h"
#endif
...@@ -38,4 +38,10 @@ ...@@ -38,4 +38,10 @@
#define IJKALIGN(x, align) ((( x ) + (align) - 1) / (align) * (align)) #define IJKALIGN(x, align) ((( x ) + (align) - 1) / (align) * (align))
#endif #endif
#define IJK_CHECK_RET(condition__, retval__, ...) \
if (!(condition__)) { \
ALOGE(__VA_ARGS__); \
return (retval__); \
}
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册