static jbyteArray android_media_MediaScanner_extractAlbumArt(JNIEnv *env, jobject thiz, jobject fileDescriptor) { MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context); if (fileDescriptor == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); return NULL; } int fd = getParcelFileDescriptorFD(env, fileDescriptor); char* data = mp->extractAlbumArt(fd); if (!data) { return NULL; } long len = *((long*)data); jbyteArray array = env->NewByteArray(len); if (array != NULL) { jbyte* bytes = env->GetByteArrayElements(array, NULL); memcpy(bytes, data + 4, len); env->ReleaseByteArrayElements(array, bytes, 0); } done: free(data); // if NewByteArray() returned NULL, an out-of-memory // exception will have been raised. I just want to // return null in that case. env->ExceptionClear(); return array; }
static jbyteArray android_media_MediaScanner_extractAlbumArt( JNIEnv *env, jobject thiz, jobject fileDescriptor) { LOGV("extractAlbumArt"); MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == NULL) { jniThrowException(env, kRunTimeException, "No scanner available"); return NULL; } if (fileDescriptor == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); return NULL; } int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); char* data = mp->extractAlbumArt(fd); if (!data) { return NULL; } long len = *((long*)data); jbyteArray array = env->NewByteArray(len); if (array != NULL) { jbyte* bytes = env->GetByteArrayElements(array, NULL); memcpy(bytes, data + 4, len); env->ReleaseByteArrayElements(array, bytes, 0); } done: free(data); // if NewByteArray() returned NULL, an out-of-memory // exception will have been raised. I just want to // return null in that case. env->ExceptionClear(); return array; }