static void android_media_MediaScanner_processDirectory( JNIEnv *env, jobject thiz, jstring path, jobject client) { LOGV("processDirectory"); MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == NULL) { jniThrowException(env, kRunTimeException, "No scanner available"); return; } if (path == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); return; } const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory return; } MyMediaScannerClient myClient(env, client); MediaScanResult result = mp->processDirectory(pathStr, myClient); if (result == MEDIA_SCAN_RESULT_ERROR) { LOGE("An error occurred while scanning directory '%s'.", pathStr); } env->ReleaseStringUTFChars(path, pathStr); }
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 void android_media_MediaScanner_processFile(JNIEnv *env, jobject thiz, jstring path, jstring mimeType, jobject client) { MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context); if (path == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); return; } const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; } const char *mimeTypeStr = (mimeType ? env->GetStringUTFChars(mimeType, NULL) : NULL); if (mimeType && mimeTypeStr == NULL) { // Out of memory env->ReleaseStringUTFChars(path, pathStr); jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; } MyMediaScannerClient myClient(env, client); mp->processFile(pathStr, mimeTypeStr, myClient); env->ReleaseStringUTFChars(path, pathStr); if (mimeType) { env->ReleaseStringUTFChars(mimeType, mimeTypeStr); } }
static void android_media_MediaScanner_processDirectory(JNIEnv *env, jobject thiz, jstring path, jstring extensions, jobject client) { MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context); if (path == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); return; } if (extensions == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); return; } const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; } const char *extensionsStr = env->GetStringUTFChars(extensions, NULL); if (extensionsStr == NULL) { // Out of memory env->ReleaseStringUTFChars(path, pathStr); jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; } MyMediaScannerClient myClient(env, client); mp->processDirectory(pathStr, extensionsStr, myClient, ExceptionCheck, env); env->ReleaseStringUTFChars(path, pathStr); env->ReleaseStringUTFChars(extensions, extensionsStr); }
static void android_media_MediaScanner_setLocale(JNIEnv *env, jobject thiz, jstring locale) { MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz, fields.context); if (locale == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); return; } const char *localeStr = env->GetStringUTFChars(locale, NULL); if (localeStr == NULL) { // Out of memory jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; } mp->setLocale(localeStr); env->ReleaseStringUTFChars(locale, localeStr); }
static void android_media_MediaScanner_processFile( JNIEnv *env, jobject thiz, jstring path, jstring mimeType, jobject client) { LOGV("processFile"); // Lock already hold by processDirectory MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == NULL) { jniThrowException(env, kRunTimeException, "No scanner available"); return; } if (path == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); return; } const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory return; } const char *mimeTypeStr = (mimeType ? env->GetStringUTFChars(mimeType, NULL) : NULL); if (mimeType && mimeTypeStr == NULL) { // Out of memory // ReleaseStringUTFChars can be called with an exception pending. env->ReleaseStringUTFChars(path, pathStr); return; } MyMediaScannerClient myClient(env, client); MediaScanResult result = mp->processFile(pathStr, mimeTypeStr, myClient); if (result == MEDIA_SCAN_RESULT_ERROR) { LOGE("An error occurred while scanning file '%s'.", pathStr); } env->ReleaseStringUTFChars(path, pathStr); if (mimeType) { env->ReleaseStringUTFChars(mimeType, mimeTypeStr); } }
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; }
static void android_media_MediaScanner_setLocale( JNIEnv *env, jobject thiz, jstring locale) { LOGV("setLocale"); MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == NULL) { jniThrowException(env, kRunTimeException, "No scanner available"); return; } if (locale == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); return; } const char *localeStr = env->GetStringUTFChars(locale, NULL); if (localeStr == NULL) { // Out of memory return; } mp->setLocale(localeStr); env->ReleaseStringUTFChars(locale, localeStr); }