jobjectArray Java_com_spotify_voyager_jni_Index_getVectors()

in java/com_spotify_voyager_jni_Index.cpp [644:674]


jobjectArray Java_com_spotify_voyager_jni_Index_getVectors(JNIEnv *env,
                                                           jobject self,
                                                           jlongArray ids) {
  try {
    std::shared_ptr<Index> index = getHandle<Index>(env, self);
    NDArray<float, 2> vectors =
        index->getVectors(toUnsignedStdVector(env, ids));

    jclass floatArrayClass = env->FindClass("[F");
    if (!floatArrayClass) {
      throw std::runtime_error("C++ bindings failed to find float[] class.");
    }

    jobjectArray javaVectors =
        env->NewObjectArray(vectors.shape[0], floatArrayClass, NULL);

    for (int i = 0; i < vectors.shape[0]; i++) {
      jfloatArray vector = env->NewFloatArray(vectors.shape[1]);
      env->SetFloatArrayRegion(vector, 0, vectors.shape[1], vectors[i]);
      env->SetObjectArrayElement(javaVectors, i, vector);
      env->DeleteLocalRef(vector);
    }

    return javaVectors;
  } catch (std::exception const &e) {
    if (!env->ExceptionCheck()) {
      env->ThrowNew(env->FindClass("java/lang/RuntimeException"), e.what());
    }
    return nullptr;
  }
}