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;
}