blob: 27e46a4c8c6cdc07ee18986c32befc2a8b607ca3 [file] [log] [blame]
/*
* 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) {
LOGE("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