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