JNIEXPORT jlong JNICALL Java_com_uber_neuropod_NeuropodTensorAllocator_nativeCreateStringTensor()

in source/neuropod/bindings/java/src/main/native/com_uber_neuropod_NeuropodTensorAllocator.cc [101:131]


JNIEXPORT jlong JNICALL Java_com_uber_neuropod_NeuropodTensorAllocator_nativeCreateStringTensor(
    JNIEnv *env, jclass, jobject data, jlongArray dims, jlong allocatorHandle)
{
    try
    {
        auto allocator = *reinterpret_cast<std::shared_ptr<neuropod::NeuropodTensorAllocator> *>(allocatorHandle);

        // Prepare shape and then allocate tensor.
        jsize                shapeSize = env->GetArrayLength(dims);
        jlong *              arr       = env->GetLongArrayElements(dims, 0);
        std::vector<int64_t> shapes(arr, arr + shapeSize);
        env->ReleaseLongArrayElements(dims, arr, JNI_ABORT);

        auto  stringTensor = allocator->allocate_tensor<std::string>(shapes);
        jsize size         = env->CallIntMethod(data, njni::java_util_ArrayList_size);
        auto  flatAccessor = stringTensor->flat();
        for (jsize i = 0; i < size; ++i)
        {
            jstring element = static_cast<jstring>(env->CallObjectMethod(data, njni::java_util_ArrayList_get, i));
            flatAccessor[i] = njni::to_string(env, element);
            env->DeleteLocalRef(element);
        }

        return reinterpret_cast<jlong>(njni::toHeap(stringTensor));
    }
    catch (const std::exception &e)
    {
        njni::throw_java_exception(env, e.what());
    }
    return reinterpret_cast<jlong>(nullptr);
}