String ImmutableIndex::GetBucketLabel(Int64 peer, Int32 index)
{
    NATIVE(AlphabeticIndex::ImmutableIndex)* ii = immutableIndexFromPeer(peer);
    // TODO: There is a problem here. Waiting for new .so files.
#if 0 // for compiling
    const NATIVE(AlphabeticIndex::Bucket)* bucket = ii->getBucket(index);
    if(NULL == bucket) {
        return String(NULL);
    }

    // Return "" for the underflow/inflow/overflow buckets.
    if (bucket->getLabelType() != U_ALPHAINDEX_NORMAL) {
        return String("");
    }

    const UnicodeString& label(bucket->getLabel());
    String s;
    ElStringByteSink sink(&s);
    label.toUTF8(sink);
    return s;
#else
    assert(0);
    return String(NULL);
#endif
}
Int32 ImmutableIndex::GetBucketCount(Int64 peer)
{
    NATIVE(AlphabeticIndex::ImmutableIndex)* ii = immutableIndexFromPeer(peer);
    // TODO: There is a problem here. Waiting for new .so files.
#if 0 // for compiling
    return ii->getBucketCount();
#else
    assert(0);
    return 0;
#endif
}
static jint ImmutableIndex_getBucketIndex(JNIEnv* env, jclass, jlong peer, jstring javaString) {
  AlphabeticIndex::ImmutableIndex* ii = immutableIndexFromPeer(peer);
  ScopedJavaUnicodeString string(env, javaString);
  if (!string.valid()) {
    return -1;
  }
  UErrorCode status = U_ZERO_ERROR;
  jint result = ii->getBucketIndex(string.unicodeString(), status);
  if (maybeThrowIcuException(env, "AlphabeticIndex::ImmutableIndex::getBucketIndex", status)) {
    return -1;
  }
  return result;
}
static jstring ImmutableIndex_getBucketLabel(JNIEnv* env, jclass, jlong peer, jint index) {
  AlphabeticIndex::ImmutableIndex* ii = immutableIndexFromPeer(peer);
  const AlphabeticIndex::Bucket* bucket = ii->getBucket(index);
  if (bucket == NULL) {
    jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid index: %d", index);
    return NULL;
  }

  // Return "" for the underflow/inflow/overflow buckets.
  if (bucket->getLabelType() != U_ALPHAINDEX_NORMAL) {
    return env->NewStringUTF("");
  }

  const UnicodeString& label(bucket->getLabel());
  return env->NewString(label.getBuffer(), label.length());
}
Int32 ImmutableIndex::GetBucketIndex(Int64 peer, const String& s)
{
    NATIVE(AlphabeticIndex::ImmutableIndex)* ii = immutableIndexFromPeer(peer);
    if(s.IsNull())
        return -1;
    UErrorCode status = U_ZERO_ERROR;
    // TODO: There is a problem here. Waiting for new .so files.
#if 0 // for compiling
    Int32 result = ii->getBucketIndex(UnicodeString::fromUTF8(s.string()), status);
    if(!U_SUCCESS(status))
        return -1;
    return result;
#else
    assert(0);
    return 0;
#endif
}
static jint ImmutableIndex_getBucketCount(JNIEnv*, jclass, jlong peer) {
  AlphabeticIndex::ImmutableIndex* ii = immutableIndexFromPeer(peer);
  return ii->getBucketCount();
}