stringFrom method

String? stringFrom(
  1. JavaRef string
)

Copies a java.lang.String back into Dart.

Returns null when string holds a Java null, mirroring the Java side rather than collapsing null into ''.

Implementation

String? stringFrom(JavaRef string) {
  if (string.isNull) return null;

  final env = this.env;
  final getLength = Jvm.fnSlotOf(env, JniFn.getStringLength)
      .cast<NativeFunction<GetStringLengthC>>()
      .asFunction<GetStringLengthDart>();
  final getChars = Jvm.fnSlotOf(
    env,
    JniFn.getStringChars,
  ).cast<NativeFunction<GetStringCharsC>>().asFunction<GetStringCharsDart>();
  final releaseChars = Jvm.fnSlotOf(env, JniFn.releaseStringChars)
      .cast<NativeFunction<ReleaseStringCharsC>>()
      .asFunction<ReleaseStringCharsDart>();

  final length = getLength(env, string.pointer);
  final chars = getChars(env, string.pointer, nullptr);
  if (chars == nullptr) {
    checkException();
    return null;
  }

  try {
    // `asTypedList` views VM-owned memory; copy out before releasing it.
    return String.fromCharCodes(chars.asTypedList(length));
  } finally {
    releaseChars(env, string.pointer, chars);
  }
}