// NOTE: support to be called from read_thread static int inject_callback(void *opaque, int what, void *data, size_t data_size) { JNIEnv *env = NULL; jobject jbundle = NULL; int ret = -1; SDL_JNI_SetupThreadEnv(&env); jobject weak_thiz = (jobject) opaque; if (weak_thiz == NULL ) goto fail; switch (what) { case IJKAVINJECT_CONCAT_RESOLVE_SEGMENT: { ret = _onNativeControlResolveSegment(env, weak_thiz, what, data, data_size); break; } case IJKAVINJECT_ON_TCP_OPEN: case IJKAVINJECT_ON_HTTP_OPEN: case IJKAVINJECT_ON_HTTP_RETRY: case IJKAVINJECT_ON_LIVE_RETRY: { IJKAVInject_OnUrlOpenData *real_data = (IJKAVInject_OnUrlOpenData *) data; jbundle = ASDK_Bundle__init(env); if (SDL_JNI_CatchException(env) || !jbundle) { ALOGE("%s: ASDK_Bundle__init failed\n", __func__); goto fail; } ASDK_Bundle__putString_c(env, jbundle, "url", real_data->url); ASDK_Bundle__putInt_c(env, jbundle, "segment_index", real_data->segment_index); ASDK_Bundle__putInt_c(env, jbundle, "retry_counter", real_data->retry_counter); if (!(*env)->CallStaticBooleanMethod(env, g_clazz.clazz, g_clazz.jmid_onNativeInvoke, weak_thiz, what, jbundle)) goto fail; ASDK_Bundle__getString_cbuf(env, jbundle, "url", real_data->url, sizeof(real_data->url)); ret = 0; break; } default: { goto fail; } } fail: SDL_JNI_CatchException(env); SDL_JNI_DeleteLocalRefP(env, &jbundle); return ret; }
// NOTE: support to be called from read_thread static int format_control_message(void *opaque, int type, void *data, size_t data_size) { JNIEnv *env = NULL; SDL_JNI_SetupThreadEnv(&env); jobject weak_thiz = (jobject) opaque; if (weak_thiz == NULL ) return -1; switch (type) { case IJKAVF_CM_RESOLVE_SEGMENT_CONCAT: return _onNativeControlResolveSegmentConcat(env, weak_thiz, type, data, data_size); case IJKAVF_CM_RESOLVE_SEGMENT: return _onNativeControlResolveSegment(env, weak_thiz, type, data, data_size); case IJKAVF_CM_RESOLVE_SEGMENT_OFFLINE: return _onNativeControlResolveSegmentOffline(env, weak_thiz, type, data, data_size); default: { return -1; } } return -1; }