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

jni: NewGlobalRef for FindClass

上级 2ebb6a85
......@@ -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)
{
(*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)
......@@ -393,6 +393,7 @@ static JNINativeMethod g_methods[] = {
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
JNIEnv* env = NULL;
jclass clazz;
g_jvm = vm;
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
......@@ -402,16 +403,20 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
pthread_mutex_init(&g_clazz.mutex, NULL);
g_clazz.clazz = (*env)->FindClass(env, JNI_CLASS_IJKPLAYER);
JNI_CHECK_RET(g_clazz.clazz, env, NULL, NULL, -1);
clazz = (*env)->FindClass(env, JNI_CLASS_IJKPLAYER);
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));
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");
JNI_CHECK_RET(g_clazz.postEventFromNative, env, NULL, NULL, -1);
IJK_CHECK_RET(g_clazz.postEventFromNative, -1, "missing postEventFromNative");
ijkmp_global_init();
......
......@@ -110,40 +110,40 @@ typedef struct audio_track_fields_t {
} audio_track_fields_t;
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)
{
g_clazz.clazz = (*env)->FindClass(env, "android.media.AudioTrack");
AT_CHECK_RET(g_clazz.clazz, -1, "missing AudioTrack");
jclass clazz;
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");
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");
AT_CHECK_RET(g_clazz.getMinBufferSize, -1, "missing AudioTrack.getMinBufferSize");
g_clazz.getMinBufferSize = (*env)->GetStaticMethodID(env, g_clazz.clazz, "getMinBufferSize", "(III)I");
IJK_CHECK_RET(g_clazz.getMinBufferSize, -1, "missing AudioTrack.getMinBufferSize");
g_clazz.play = (*env)->GetMethodID(env, g_clazz.clazz, "play", "(V)V");
AT_CHECK_RET(g_clazz.play, -1, "missing AudioTrack.play");
g_clazz.play = (*env)->GetMethodID(env, g_clazz.clazz, "play", "()V");
IJK_CHECK_RET(g_clazz.play, -1, "missing AudioTrack.play");
g_clazz.pause = (*env)->GetMethodID(env, g_clazz.clazz, "pause", "(V)V");
AT_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.pause");
g_clazz.pause = (*env)->GetMethodID(env, g_clazz.clazz, "pause", "()V");
IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.pause");
g_clazz.flush = (*env)->GetMethodID(env, g_clazz.clazz, "flush", "(V)V");
JNI_CHECK_RET(g_clazz.flush, env, NULL, NULL, -1);
g_clazz.flush = (*env)->GetMethodID(env, g_clazz.clazz, "flush", "()V");
IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.flush");
g_clazz.stop = (*env)->GetMethodID(env, g_clazz.clazz, "stop", "(V)V");
JNI_CHECK_RET(g_clazz.stop, env, NULL, NULL, -1);
g_clazz.stop = (*env)->GetMethodID(env, g_clazz.clazz, "stop", "()V");
IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.stop");
g_clazz.release = (*env)->GetMethodID(env, g_clazz.clazz, "release", "(V)V");
JNI_CHECK_RET(g_clazz.release, env, NULL, NULL, -1);
g_clazz.release = (*env)->GetMethodID(env, g_clazz.clazz, "release", "()V");
IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.release");
g_clazz.write_byte = (*env)->GetMethodID(env, g_clazz.clazz, "write", "([BII)V");
JNI_CHECK_RET(g_clazz.write_byte, env, NULL, NULL, -1);
g_clazz.write_byte = (*env)->GetMethodID(env, g_clazz.clazz, "write", "([BII)I");
IJK_CHECK_RET(g_clazz.pause, -1, "missing AudioTrack.write");
return 0;
}
......@@ -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,
spec->stream_type, spec->sample_rate_in_hz, spec->channel_config,
spec->audio_format, min_buffer_size, spec->mode);
(int) spec->stream_type, (int) spec->sample_rate_in_hz, (int) spec->channel_config,
(int) spec->audio_format, (int) min_buffer_size, (int) spec->mode);
if (!thiz || (*env)->ExceptionCheck(env)) {
ALOGE("sdl_audiotrack_new: NewObject: Exception:");
if ((*env)->ExceptionCheck(env)) {
......
......@@ -23,7 +23,8 @@
#include "ijksdl_android_jni.h"
#include "../ijksdl_inc_internal.h"
#include "ijksdl_inc_internal_android.h"
#include "android_audiotrack.h"
JavaVM *g_jvm;
......@@ -56,6 +57,7 @@ jint SDL_AndroidJni_DetachCurrentThread()
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
int retval;
JNIEnv* env = NULL;
g_jvm = vm;
......@@ -63,6 +65,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
return -1;
}
retval = sdl_audiotrack_global_init(env);
JNI_CHECK_RET(retval == 0, env, NULL, NULL, -1);
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 @@
#define IJKALIGN(x, align) ((( x ) + (align) - 1) / (align) * (align))
#endif
#define IJK_CHECK_RET(condition__, retval__, ...) \
if (!(condition__)) { \
ALOGE(__VA_ARGS__); \
return (retval__); \
}
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册