#pragma once #include "conversion.hpp" #include #include #include #include #include #include namespace mbgl { namespace android { namespace conversion { template <> struct Converter { Result operator()(jni::JNIEnv& env, const bool& value) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Boolean")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(Z)V"); return {&jni::NewObject(env, *javaClass, *constructor, (jboolean) value)}; } }; template <> struct Converter { Result operator()(jni::JNIEnv&, const bool& value) const { return {(jni::jboolean) value}; } }; template <> struct Converter { Result operator()(jni::JNIEnv& env, const float& value) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(F)V"); return {&jni::NewObject(env, *javaClass, *constructor, (jfloat) value)}; } }; template <> struct Converter { Result operator()(jni::JNIEnv&, const float& value) const { return {(jni::jfloat) value}; } }; template <> struct Converter { Result operator()(jni::JNIEnv& env, const double& value) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Double")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(D)V"); return {&jni::NewObject(env, *javaClass, *constructor, (jfloat) value)}; } }; template <> struct Converter { Result operator()(jni::JNIEnv&, const double& value) const { return {(jni::jdouble) value}; } }; /** * All integrals. java is limited to 64 bit signed, so... * TODO: use BigDecimal for > 64 / unsigned? */ template struct Converter::value>::type> { Result operator()(jni::JNIEnv& env, const T& value) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Long")).release(); static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(J)V"); return {&jni::NewObject(env, *javaClass, *constructor, (jlong) value)}; } }; //TODO: convert integral types to primitive jni types template <> struct Converter { Result operator()(jni::JNIEnv& env, const std::string& value) const { return {jni::Make(env, value).Get()}; } }; template <> struct Converter { Result operator()(jni::JNIEnv& env, const std::string& value) const { return {jni::Make(env, value).Get()}; } }; template <> struct Converter { Result operator()(jni::JNIEnv& env, const Color& value) const { std::stringstream sstream; sstream << "rgba(" << value.r << ", " << value.g << ", " << value.b << ", " << value.a << ")"; std::string result = sstream.str(); return convert(env, result); } }; template struct Converter> { Result operator()(jni::JNIEnv& env, const std::array& value) const { std::vector v; for (const float& id : value) { v.push_back(id); } return convert>(env, v); } }; template <> struct Converter> { Result operator()(jni::JNIEnv& env, const std::vector& value) const { static jni::jclass* stringCass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/String")).release(); jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *stringCass); for(size_t i = 0; i < value.size(); i = i + 1) { Result converted = convert(env, value.at(i)); jni::SetObjectArrayElement(env, jarray, i, *converted); } return &jarray; } }; template <> struct Converter> { Result operator()(jni::JNIEnv& env, const std::vector& value) const { static jni::jclass* floatClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *floatClass); for(size_t i = 0; i < value.size(); i = i + 1) { Result converted = convert(env, value.at(i)); jni::SetObjectArrayElement(env, jarray, i, *converted); } return &jarray; } }; // Java -> C++ template <> struct Converter { Result operator()(jni::JNIEnv& env, const jni::String& value) const { return { jni::Make(env, value) }; } }; } // namespace conversion } // namespace style } // namespace mbgl