QSClass *QSEnv::classByName(const QString &n) { QSClass *t = 0; // ### use an expandable dict if (n == QString::fromLatin1("Null")) t = nullClass(); else if (n == QString::fromLatin1("Number")) t = numberClass(); else if (n == QString::fromLatin1("Boolean")) t = booleanClass(); else if (n == QString::fromLatin1("String")) t = stringClass(); else qDebug("TypeNode::rhs: Ignoring unknown type %s.", n.ascii()); return t; }
status_t ConvertKeyValueArraysToMessage( JNIEnv *env, jobjectArray keys, jobjectArray values, sp<AMessage> *out) { ScopedLocalRef<jclass> stringClass(env, env->FindClass("java/lang/String")); CHECK(stringClass.get() != NULL); ScopedLocalRef<jclass> integerClass(env, env->FindClass("java/lang/Integer")); CHECK(integerClass.get() != NULL); ScopedLocalRef<jclass> longClass(env, env->FindClass("java/lang/Long")); CHECK(longClass.get() != NULL); ScopedLocalRef<jclass> floatClass(env, env->FindClass("java/lang/Float")); CHECK(floatClass.get() != NULL); ScopedLocalRef<jclass> byteBufClass(env, env->FindClass("java/nio/ByteBuffer")); CHECK(byteBufClass.get() != NULL); sp<AMessage> msg = new AMessage; jsize numEntries = 0; if (keys != NULL) { if (values == NULL) { return -EINVAL; } numEntries = env->GetArrayLength(keys); if (numEntries != env->GetArrayLength(values)) { return -EINVAL; } } else if (values != NULL) { return -EINVAL; } for (jsize i = 0; i < numEntries; ++i) { jobject keyObj = env->GetObjectArrayElement(keys, i); if (!env->IsInstanceOf(keyObj, stringClass.get())) { return -EINVAL; } const char *tmp = env->GetStringUTFChars((jstring)keyObj, NULL); if (tmp == NULL) { return -ENOMEM; } AString key = tmp; env->ReleaseStringUTFChars((jstring)keyObj, tmp); tmp = NULL; jobject valueObj = env->GetObjectArrayElement(values, i); if (env->IsInstanceOf(valueObj, stringClass.get())) { const char *value = env->GetStringUTFChars((jstring)valueObj, NULL); if (value == NULL) { return -ENOMEM; } msg->setString(key.c_str(), value); env->ReleaseStringUTFChars((jstring)valueObj, value); value = NULL; } else if (env->IsInstanceOf(valueObj, integerClass.get())) { jmethodID intValueID = env->GetMethodID(integerClass.get(), "intValue", "()I"); CHECK(intValueID != NULL); jint value = env->CallIntMethod(valueObj, intValueID); msg->setInt32(key.c_str(), value); } else if (env->IsInstanceOf(valueObj, longClass.get())) { jmethodID longValueID = env->GetMethodID(longClass.get(), "longValue", "()J"); CHECK(longValueID != NULL); jlong value = env->CallLongMethod(valueObj, longValueID); msg->setInt64(key.c_str(), value); } else if (env->IsInstanceOf(valueObj, floatClass.get())) { jmethodID floatValueID = env->GetMethodID(floatClass.get(), "floatValue", "()F"); CHECK(floatValueID != NULL); jfloat value = env->CallFloatMethod(valueObj, floatValueID); msg->setFloat(key.c_str(), value); } else if (env->IsInstanceOf(valueObj, byteBufClass.get())) { jmethodID positionID = env->GetMethodID(byteBufClass.get(), "position", "()I"); CHECK(positionID != NULL); jmethodID limitID = env->GetMethodID(byteBufClass.get(), "limit", "()I"); CHECK(limitID != NULL); jint position = env->CallIntMethod(valueObj, positionID); jint limit = env->CallIntMethod(valueObj, limitID); sp<ABuffer> buffer = new ABuffer(limit - position); void *data = env->GetDirectBufferAddress(valueObj); if (data != NULL) { memcpy(buffer->data(), (const uint8_t *)data + position, buffer->size()); } else { jmethodID arrayID = env->GetMethodID(byteBufClass.get(), "array", "()[B"); CHECK(arrayID != NULL); jbyteArray byteArray = (jbyteArray)env->CallObjectMethod(valueObj, arrayID); CHECK(byteArray != NULL); env->GetByteArrayRegion( byteArray, position, buffer->size(), (jbyte *)buffer->data()); env->DeleteLocalRef(byteArray); byteArray = NULL; } msg->setBuffer(key.c_str(), buffer); } } *out = msg; return OK; }