| /* |
| * Copyright 2011, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // #define LOG_NDEBUG 0 |
| #define LOG_TAG "AndroidMediaUtils" |
| |
| #include <utils/Log.h> |
| #include "android_media_Utils.h" |
| |
| namespace android { |
| |
| bool ConvertKeyValueArraysToKeyedVector( |
| JNIEnv *env, jobjectArray keys, jobjectArray values, |
| KeyedVector<String8, String8>* keyedVector) { |
| |
| int nKeyValuePairs = 0; |
| bool failed = false; |
| if (keys != NULL && values != NULL) { |
| nKeyValuePairs = env->GetArrayLength(keys); |
| failed = (nKeyValuePairs != env->GetArrayLength(values)); |
| } |
| |
| if (!failed) { |
| failed = ((keys != NULL && values == NULL) || |
| (keys == NULL && values != NULL)); |
| } |
| |
| if (failed) { |
| ALOGE("keys and values arrays have different length"); |
| jniThrowException(env, "java/lang/IllegalArgumentException", NULL); |
| return false; |
| } |
| |
| for (int i = 0; i < nKeyValuePairs; ++i) { |
| // No need to check on the ArrayIndexOutOfBoundsException, since |
| // it won't happen here. |
| jstring key = (jstring) env->GetObjectArrayElement(keys, i); |
| jstring value = (jstring) env->GetObjectArrayElement(values, i); |
| |
| const char* keyStr = env->GetStringUTFChars(key, NULL); |
| if (!keyStr) { // OutOfMemoryError |
| return false; |
| } |
| |
| const char* valueStr = env->GetStringUTFChars(value, NULL); |
| if (!valueStr) { // OutOfMemoryError |
| env->ReleaseStringUTFChars(key, keyStr); |
| return false; |
| } |
| |
| keyedVector->add(String8(keyStr), String8(valueStr)); |
| |
| env->ReleaseStringUTFChars(key, keyStr); |
| env->ReleaseStringUTFChars(value, valueStr); |
| env->DeleteLocalRef(key); |
| env->DeleteLocalRef(value); |
| } |
| return true; |
| } |
| |
| } // namespace android |
| |