jobject toJavaTensorSpecList()

in source/neuropod/bindings/java/src/main/native/com_uber_neuropod_Neuropod.cc [38:79]


jobject toJavaTensorSpecList(JNIEnv *env, const std::vector<neuropod::TensorSpec> &specs)
{
    jobject ret = env->NewObject(njni::java_util_ArrayList, njni::java_util_ArrayList_, specs.size());
    if (!ret || env->ExceptionCheck())
    {
        throw std::runtime_error("NewObject failed: cannot create ArrayList");
    }

    for (const auto &tensorSpec : specs)
    {
        auto    type = njni::get_tensor_type_field(env, njni::tensor_type_to_string(tensorSpec.type));
        jstring name = env->NewStringUTF(tensorSpec.name.c_str());
        jobject dims = env->NewObject(njni::java_util_ArrayList, njni::java_util_ArrayList_, tensorSpec.dims.size());
        for (const auto &dim : tensorSpec.dims)
        {
            // Neuropod uses "reserved" number for symbolic Dim.
            if (dim.value == -2)
            {
                jstring symbol  = env->NewStringUTF(dim.symbol.c_str());
                jobject javaDim = env->NewObject(
                    njni::com_uber_neuropod_Dimension, njni::com_uber_neuropod_Dimension_symbol_, symbol);
                env->CallBooleanMethod(dims, njni::java_util_ArrayList_add, javaDim);
                env->DeleteLocalRef(javaDim);
                env->DeleteLocalRef(symbol);
            }
            else
            {
                jobject javaDim = env->NewObject(
                    njni::com_uber_neuropod_Dimension, njni::com_uber_neuropod_Dimension_value_, dim.value);
                env->CallBooleanMethod(dims, njni::java_util_ArrayList_add, javaDim);
                env->DeleteLocalRef(javaDim);
            }
        }
        jobject javaTensorSpec =
            env->NewObject(njni::com_uber_neuropod_TensorSpec, njni::com_uber_neuropod_TensorSpec_, name, type, dims);
        env->CallBooleanMethod(ret, njni::java_util_ArrayList_add, javaTensorSpec);
        env->DeleteLocalRef(name);
        env->DeleteLocalRef(dims);
        env->DeleteLocalRef(type);
    }
    return ret;
}