mirror of https://github.com/mpv-player/mpv
misc/jni: introduce macros for deleting references
This commit is contained in:
parent
75ae44472b
commit
5b1eaf3ff1
|
@ -276,8 +276,6 @@ const static struct {
|
||||||
};
|
};
|
||||||
#undef ENTRY
|
#undef ENTRY
|
||||||
|
|
||||||
#define MP_JNI_DELETELOCAL(o) (*env)->DeleteLocalRef(env, o)
|
|
||||||
|
|
||||||
static int AudioTrack_New(struct ao *ao)
|
static int AudioTrack_New(struct ao *ao)
|
||||||
{
|
{
|
||||||
struct priv *p = ao->priv;
|
struct priv *p = ao->priv;
|
||||||
|
@ -291,24 +289,24 @@ static int AudioTrack_New(struct ao *ao)
|
||||||
jobject format_builder = MP_JNI_NEW(AudioFormatBuilder.clazz, AudioFormatBuilder.ctor);
|
jobject format_builder = MP_JNI_NEW(AudioFormatBuilder.clazz, AudioFormatBuilder.ctor);
|
||||||
MP_JNI_EXCEPTION_LOG(ao);
|
MP_JNI_EXCEPTION_LOG(ao);
|
||||||
tmp = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.setEncoding, p->format);
|
tmp = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.setEncoding, p->format);
|
||||||
MP_JNI_DELETELOCAL(tmp);
|
MP_JNI_LOCAL_FREEP(&tmp);
|
||||||
tmp = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.setSampleRate, p->samplerate);
|
tmp = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.setSampleRate, p->samplerate);
|
||||||
MP_JNI_DELETELOCAL(tmp);
|
MP_JNI_LOCAL_FREEP(&tmp);
|
||||||
tmp = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.setChannelMask, p->channel_config);
|
tmp = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.setChannelMask, p->channel_config);
|
||||||
MP_JNI_DELETELOCAL(tmp);
|
MP_JNI_LOCAL_FREEP(&tmp);
|
||||||
jobject format = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.build);
|
jobject format = MP_JNI_CALL_OBJECT(format_builder, AudioFormatBuilder.build);
|
||||||
MP_JNI_DELETELOCAL(format_builder);
|
MP_JNI_LOCAL_FREEP(&format_builder);
|
||||||
|
|
||||||
jobject attr_builder = MP_JNI_NEW(AudioAttributesBuilder.clazz, AudioAttributesBuilder.ctor);
|
jobject attr_builder = MP_JNI_NEW(AudioAttributesBuilder.clazz, AudioAttributesBuilder.ctor);
|
||||||
MP_JNI_EXCEPTION_LOG(ao);
|
MP_JNI_EXCEPTION_LOG(ao);
|
||||||
tmp = MP_JNI_CALL_OBJECT(attr_builder, AudioAttributesBuilder.setUsage, AudioAttributes.USAGE_MEDIA);
|
tmp = MP_JNI_CALL_OBJECT(attr_builder, AudioAttributesBuilder.setUsage, AudioAttributes.USAGE_MEDIA);
|
||||||
MP_JNI_DELETELOCAL(tmp);
|
MP_JNI_LOCAL_FREEP(&tmp);
|
||||||
jint content_type = (ao->init_flags & AO_INIT_MEDIA_ROLE_MUSIC) ?
|
jint content_type = (ao->init_flags & AO_INIT_MEDIA_ROLE_MUSIC) ?
|
||||||
AudioAttributes.CONTENT_TYPE_MUSIC : AudioAttributes.CONTENT_TYPE_MOVIE;
|
AudioAttributes.CONTENT_TYPE_MUSIC : AudioAttributes.CONTENT_TYPE_MOVIE;
|
||||||
tmp = MP_JNI_CALL_OBJECT(attr_builder, AudioAttributesBuilder.setContentType, content_type);
|
tmp = MP_JNI_CALL_OBJECT(attr_builder, AudioAttributesBuilder.setContentType, content_type);
|
||||||
MP_JNI_DELETELOCAL(tmp);
|
MP_JNI_LOCAL_FREEP(&tmp);
|
||||||
jobject attr = MP_JNI_CALL_OBJECT(attr_builder, AudioAttributesBuilder.build);
|
jobject attr = MP_JNI_CALL_OBJECT(attr_builder, AudioAttributesBuilder.build);
|
||||||
MP_JNI_DELETELOCAL(attr_builder);
|
MP_JNI_LOCAL_FREEP(&attr_builder);
|
||||||
|
|
||||||
audiotrack = MP_JNI_NEW(
|
audiotrack = MP_JNI_NEW(
|
||||||
AudioTrack.clazz,
|
AudioTrack.clazz,
|
||||||
|
@ -320,8 +318,8 @@ static int AudioTrack_New(struct ao *ao)
|
||||||
p->cfg_session_id
|
p->cfg_session_id
|
||||||
);
|
);
|
||||||
|
|
||||||
MP_JNI_DELETELOCAL(format);
|
MP_JNI_LOCAL_FREEP(&format);
|
||||||
MP_JNI_DELETELOCAL(attr);
|
MP_JNI_LOCAL_FREEP(&attr);
|
||||||
} else {
|
} else {
|
||||||
MP_VERBOSE(ao, "Using legacy initializer\n");
|
MP_VERBOSE(ao, "Using legacy initializer\n");
|
||||||
audiotrack = MP_JNI_NEW(
|
audiotrack = MP_JNI_NEW(
|
||||||
|
@ -344,7 +342,7 @@ static int AudioTrack_New(struct ao *ao)
|
||||||
if (MP_JNI_CALL_INT(audiotrack, AudioTrack.getState) != AudioTrack.STATE_INITIALIZED) {
|
if (MP_JNI_CALL_INT(audiotrack, AudioTrack.getState) != AudioTrack.STATE_INITIALIZED) {
|
||||||
MP_JNI_CALL_VOID(audiotrack, AudioTrack.release);
|
MP_JNI_CALL_VOID(audiotrack, AudioTrack.release);
|
||||||
MP_JNI_EXCEPTION_LOG(ao);
|
MP_JNI_EXCEPTION_LOG(ao);
|
||||||
(*env)->DeleteLocalRef(env, audiotrack);
|
MP_JNI_LOCAL_FREEP(&audiotrack);
|
||||||
MP_ERR(ao, "AudioTrack.getState failed\n");
|
MP_ERR(ao, "AudioTrack.getState failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -358,7 +356,7 @@ static int AudioTrack_New(struct ao *ao)
|
||||||
}
|
}
|
||||||
|
|
||||||
p->audiotrack = (*env)->NewGlobalRef(env, audiotrack);
|
p->audiotrack = (*env)->NewGlobalRef(env, audiotrack);
|
||||||
(*env)->DeleteLocalRef(env, audiotrack);
|
MP_JNI_LOCAL_FREEP(&audiotrack);
|
||||||
if (!p->audiotrack)
|
if (!p->audiotrack)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -372,8 +370,7 @@ static int AudioTrack_Recreate(struct ao *ao)
|
||||||
|
|
||||||
MP_JNI_CALL_VOID(p->audiotrack, AudioTrack.release);
|
MP_JNI_CALL_VOID(p->audiotrack, AudioTrack.release);
|
||||||
MP_JNI_EXCEPTION_LOG(ao);
|
MP_JNI_EXCEPTION_LOG(ao);
|
||||||
(*env)->DeleteGlobalRef(env, p->audiotrack);
|
MP_JNI_GLOBAL_FREEP(&p->audiotrack);
|
||||||
p->audiotrack = NULL;
|
|
||||||
return AudioTrack_New(ao);
|
return AudioTrack_New(ao);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -504,7 +501,7 @@ static int AudioTrack_write(struct ao *ao, int len)
|
||||||
// reset positions for reading
|
// reset positions for reading
|
||||||
jobject bbuf = MP_JNI_CALL_OBJECT(p->bbuf, ByteBuffer.clear);
|
jobject bbuf = MP_JNI_CALL_OBJECT(p->bbuf, ByteBuffer.clear);
|
||||||
if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1;
|
if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1;
|
||||||
(*env)->DeleteLocalRef(env, bbuf);
|
MP_JNI_LOCAL_FREEP(&bbuf);
|
||||||
ret = MP_JNI_CALL_INT(p->audiotrack, AudioTrack.writeBufferV21, p->bbuf, len, AudioTrack.WRITE_BLOCKING);
|
ret = MP_JNI_CALL_INT(p->audiotrack, AudioTrack.writeBufferV21, p->bbuf, len, AudioTrack.WRITE_BLOCKING);
|
||||||
if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1;
|
if (MP_JNI_EXCEPTION_LOG(ao) < 0) return -1;
|
||||||
|
|
||||||
|
@ -609,34 +606,18 @@ static void uninit(struct ao *ao)
|
||||||
if (p->audiotrack) {
|
if (p->audiotrack) {
|
||||||
MP_JNI_CALL_VOID(p->audiotrack, AudioTrack.release);
|
MP_JNI_CALL_VOID(p->audiotrack, AudioTrack.release);
|
||||||
MP_JNI_EXCEPTION_LOG(ao);
|
MP_JNI_EXCEPTION_LOG(ao);
|
||||||
(*env)->DeleteGlobalRef(env, p->audiotrack);
|
MP_JNI_GLOBAL_FREEP(&p->audiotrack);
|
||||||
p->audiotrack = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->bytearray) {
|
MP_JNI_GLOBAL_FREEP(&p->bytearray);
|
||||||
(*env)->DeleteGlobalRef(env, p->bytearray);
|
|
||||||
p->bytearray = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p->shortarray) {
|
MP_JNI_GLOBAL_FREEP(&p->shortarray);
|
||||||
(*env)->DeleteGlobalRef(env, p->shortarray);
|
|
||||||
p->shortarray = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p->floatarray) {
|
MP_JNI_GLOBAL_FREEP(&p->floatarray);
|
||||||
(*env)->DeleteGlobalRef(env, p->floatarray);
|
|
||||||
p->floatarray = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p->bbuf) {
|
MP_JNI_GLOBAL_FREEP(&p->bbuf);
|
||||||
(*env)->DeleteGlobalRef(env, p->bbuf);
|
|
||||||
p->bbuf = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p->timestamp) {
|
MP_JNI_GLOBAL_FREEP(&p->timestamp);
|
||||||
(*env)->DeleteGlobalRef(env, p->timestamp);
|
|
||||||
p->timestamp = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_cond_destroy(&p->wakeup);
|
mp_cond_destroy(&p->wakeup);
|
||||||
mp_mutex_destroy(&p->lock);
|
mp_mutex_destroy(&p->lock);
|
||||||
|
@ -757,26 +738,26 @@ static int init(struct ao *ao)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
p->timestamp = (*env)->NewGlobalRef(env, timestamp);
|
p->timestamp = (*env)->NewGlobalRef(env, timestamp);
|
||||||
(*env)->DeleteLocalRef(env, timestamp);
|
MP_JNI_LOCAL_FREEP(×tamp);
|
||||||
|
|
||||||
// decide and create buffer of right type
|
// decide and create buffer of right type
|
||||||
if (p->format == AudioFormat.ENCODING_IEC61937) {
|
if (p->format == AudioFormat.ENCODING_IEC61937) {
|
||||||
jshortArray shortarray = (*env)->NewShortArray(env, p->chunksize / 2);
|
jshortArray shortarray = (*env)->NewShortArray(env, p->chunksize / 2);
|
||||||
p->shortarray = (*env)->NewGlobalRef(env, shortarray);
|
p->shortarray = (*env)->NewGlobalRef(env, shortarray);
|
||||||
(*env)->DeleteLocalRef(env, shortarray);
|
MP_JNI_LOCAL_FREEP(&shortarray);
|
||||||
} else if (AudioTrack.writeBufferV21) {
|
} else if (AudioTrack.writeBufferV21) {
|
||||||
MP_VERBOSE(ao, "Using NIO ByteBuffer\n");
|
MP_VERBOSE(ao, "Using NIO ByteBuffer\n");
|
||||||
jobject bbuf = (*env)->NewDirectByteBuffer(env, p->chunk, p->chunksize);
|
jobject bbuf = (*env)->NewDirectByteBuffer(env, p->chunk, p->chunksize);
|
||||||
p->bbuf = (*env)->NewGlobalRef(env, bbuf);
|
p->bbuf = (*env)->NewGlobalRef(env, bbuf);
|
||||||
(*env)->DeleteLocalRef(env, bbuf);
|
MP_JNI_LOCAL_FREEP(&bbuf);
|
||||||
} else if (p->format == AudioFormat.ENCODING_PCM_FLOAT) {
|
} else if (p->format == AudioFormat.ENCODING_PCM_FLOAT) {
|
||||||
jfloatArray floatarray = (*env)->NewFloatArray(env, p->chunksize / sizeof(float));
|
jfloatArray floatarray = (*env)->NewFloatArray(env, p->chunksize / sizeof(float));
|
||||||
p->floatarray = (*env)->NewGlobalRef(env, floatarray);
|
p->floatarray = (*env)->NewGlobalRef(env, floatarray);
|
||||||
(*env)->DeleteLocalRef(env, floatarray);
|
MP_JNI_LOCAL_FREEP(&floatarray);
|
||||||
} else {
|
} else {
|
||||||
jbyteArray bytearray = (*env)->NewByteArray(env, p->chunksize);
|
jbyteArray bytearray = (*env)->NewByteArray(env, p->chunksize);
|
||||||
p->bytearray = (*env)->NewGlobalRef(env, bytearray);
|
p->bytearray = (*env)->NewGlobalRef(env, bytearray);
|
||||||
(*env)->DeleteLocalRef(env, bytearray);
|
MP_JNI_LOCAL_FREEP(&bytearray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create AudioTrack object */
|
/* create AudioTrack object */
|
||||||
|
|
28
misc/jni.c
28
misc/jni.c
|
@ -166,8 +166,7 @@ int mp_jni_exception_get_summary(JNIEnv *env, jthrowable exception,
|
||||||
|
|
||||||
if (string) {
|
if (string) {
|
||||||
name = mp_jni_jstring_to_utf_chars(env, string, log);
|
name = mp_jni_jstring_to_utf_chars(env, string, log);
|
||||||
(*env)->DeleteLocalRef(env, string);
|
MP_JNI_LOCAL_FREEP(&string);
|
||||||
string = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jmethodID get_message_id = (*env)->GetMethodID(env, exception_class, "getMessage", "()Ljava/lang/String;");
|
jmethodID get_message_id = (*env)->GetMethodID(env, exception_class, "getMessage", "()Ljava/lang/String;");
|
||||||
|
@ -188,8 +187,7 @@ int mp_jni_exception_get_summary(JNIEnv *env, jthrowable exception,
|
||||||
|
|
||||||
if (string) {
|
if (string) {
|
||||||
message = mp_jni_jstring_to_utf_chars(env, string, log);
|
message = mp_jni_jstring_to_utf_chars(env, string, log);
|
||||||
(*env)->DeleteLocalRef(env, string);
|
MP_JNI_LOCAL_FREEP(&string);
|
||||||
string = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name && message) {
|
if (name && message) {
|
||||||
|
@ -208,17 +206,9 @@ done:
|
||||||
talloc_free(name);
|
talloc_free(name);
|
||||||
talloc_free(message);
|
talloc_free(message);
|
||||||
|
|
||||||
if (class_class) {
|
MP_JNI_LOCAL_FREEP(&class_class);
|
||||||
(*env)->DeleteLocalRef(env, class_class);
|
MP_JNI_LOCAL_FREEP(&exception_class);
|
||||||
}
|
MP_JNI_LOCAL_FREEP(&string);
|
||||||
|
|
||||||
if (exception_class) {
|
|
||||||
(*env)->DeleteLocalRef(env, exception_class);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string) {
|
|
||||||
(*env)->DeleteLocalRef(env, string);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -238,7 +228,7 @@ int mp_jni_exception_check(JNIEnv *env, int logging, struct mp_log *log)
|
||||||
|
|
||||||
char *message = NULL;
|
char *message = NULL;
|
||||||
int ret = mp_jni_exception_get_summary(env, exception, &message, log);
|
int ret = mp_jni_exception_get_summary(env, exception, &message, log);
|
||||||
(*env)->DeleteLocalRef(env, exception);
|
MP_JNI_LOCAL_FREEP(&exception);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -277,7 +267,7 @@ int mp_jni_init_jfields(JNIEnv *env, void *jfields,
|
||||||
global ? (*env)->NewGlobalRef(env, clazz) : clazz;
|
global ? (*env)->NewGlobalRef(env, clazz) : clazz;
|
||||||
|
|
||||||
if (global)
|
if (global)
|
||||||
(*env)->DeleteLocalRef(env, clazz);
|
MP_JNI_LOCAL_FREEP(&clazz);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -365,9 +355,9 @@ int mp_jni_reset_jfields(JNIEnv *env, void *jfields,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (global) {
|
if (global) {
|
||||||
(*env)->DeleteGlobalRef(env, clazz);
|
MP_JNI_GLOBAL_FREEP(&clazz);
|
||||||
} else {
|
} else {
|
||||||
(*env)->DeleteLocalRef(env, clazz);
|
MP_JNI_LOCAL_FREEP(&clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
*(jclass*)jfield = NULL;
|
*(jclass*)jfield = NULL;
|
||||||
|
|
12
misc/jni.h
12
misc/jni.h
|
@ -29,7 +29,7 @@
|
||||||
#define MP_JNI_GET_ENV(obj) mp_jni_get_env((obj)->log)
|
#define MP_JNI_GET_ENV(obj) mp_jni_get_env((obj)->log)
|
||||||
#define MP_JNI_EXCEPTION_CHECK() mp_jni_exception_check(env, 0, NULL)
|
#define MP_JNI_EXCEPTION_CHECK() mp_jni_exception_check(env, 0, NULL)
|
||||||
#define MP_JNI_EXCEPTION_LOG(obj) mp_jni_exception_check(env, 1, (obj)->log)
|
#define MP_JNI_EXCEPTION_LOG(obj) mp_jni_exception_check(env, 1, (obj)->log)
|
||||||
#define MP_JNI_DO(what, obj, method, ...) (*env)->what(env, obj, method, ##__VA_ARGS__)
|
#define MP_JNI_DO(what, obj, ...) (*env)->what(env, obj, ##__VA_ARGS__)
|
||||||
#define MP_JNI_NEW(clazz, method, ...) MP_JNI_DO(NewObject, clazz, method, ##__VA_ARGS__)
|
#define MP_JNI_NEW(clazz, method, ...) MP_JNI_DO(NewObject, clazz, method, ##__VA_ARGS__)
|
||||||
#define MP_JNI_CALL_INT(obj, method, ...) MP_JNI_DO(CallIntMethod, obj, method, ##__VA_ARGS__)
|
#define MP_JNI_CALL_INT(obj, method, ...) MP_JNI_DO(CallIntMethod, obj, method, ##__VA_ARGS__)
|
||||||
#define MP_JNI_CALL_BOOL(obj, method, ...) MP_JNI_DO(CallBooleanMethod, obj, method, ##__VA_ARGS__)
|
#define MP_JNI_CALL_BOOL(obj, method, ...) MP_JNI_DO(CallBooleanMethod, obj, method, ##__VA_ARGS__)
|
||||||
|
@ -39,6 +39,16 @@
|
||||||
#define MP_JNI_GET_INT(obj, field) MP_JNI_DO(GetIntField, obj, field)
|
#define MP_JNI_GET_INT(obj, field) MP_JNI_DO(GetIntField, obj, field)
|
||||||
#define MP_JNI_GET_LONG(obj, field) MP_JNI_DO(GetLongField, obj, field)
|
#define MP_JNI_GET_LONG(obj, field) MP_JNI_DO(GetLongField, obj, field)
|
||||||
#define MP_JNI_GET_BOOL(obj, field) MP_JNI_DO(GetBoolField, obj, field)
|
#define MP_JNI_GET_BOOL(obj, field) MP_JNI_DO(GetBoolField, obj, field)
|
||||||
|
#define MP_JNI_LOCAL_FREEP(objp) do { \
|
||||||
|
if (*(objp)) \
|
||||||
|
MP_JNI_DO(DeleteLocalRef, *(objp)); \
|
||||||
|
*(objp) = NULL; \
|
||||||
|
} while (0)
|
||||||
|
#define MP_JNI_GLOBAL_FREEP(objp) do { \
|
||||||
|
if (*(objp)) \
|
||||||
|
MP_JNI_DO(DeleteGlobalRef, *(objp)); \
|
||||||
|
*(objp) = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attach permanently a JNI environment to the current thread and retrieve it.
|
* Attach permanently a JNI environment to the current thread and retrieve it.
|
||||||
|
|
Loading…
Reference in New Issue