blob: d49385b476f7a0421499824ca3c1dd8fc2fb01ae [file] [log] [blame] [edit]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:ffi';
import '../internal_helpers_for_jnigen.dart';
import 'jobject.dart';
import 'third_party/generated_bindings.dart';
void _fillJValue(Pointer<JValue> pos, dynamic arg) {
switch (arg) {
case JObject():
pos.ref.l = arg.reference.pointer;
case JReference():
pos.ref.l = arg.pointer;
case Pointer<Never>(): // for nullptr
pos.ref.l = arg;
break;
case int():
pos.ref.j = arg;
break;
case bool():
pos.ref.z = arg ? 1 : 0;
break;
case double():
pos.ref.d = arg;
break;
case JValueFloat():
pos.ref.f = arg.value;
break;
case JValueInt():
pos.ref.i = arg.value;
break;
case JValueShort():
pos.ref.s = arg.value;
break;
case JValueChar():
pos.ref.c = arg.value;
break;
case JValueByte():
pos.ref.b = arg.value;
break;
default:
throw UnsupportedError('cannot convert ${arg.runtimeType} to jvalue');
}
}
/// Converts passed arguments to JValue array
/// for use in methods that take arguments.
///
/// int, bool, double and JObject types are converted out of the box.
/// wrap values in types such as [JValueInt]
/// to convert to other primitive types instead.
Pointer<JValue> toJValues(List<dynamic> args, {required Allocator allocator}) {
final result = allocator<JValue>(args.length);
for (var i = 0; i < args.length; i++) {
final arg = args[i];
final pos = result + i;
_fillJValue(pos, arg);
}
return result;
}
/// Use this class as wrapper to convert an integer
/// to Java `int` in jvalues method.
final class JValueInt {
int value;
JValueInt(this.value);
}
/// Use this class as wrapper to convert an integer
/// to Java `short` in jvalues method.
final class JValueShort {
int value;
JValueShort(this.value);
}
/// Use this class as wrapper to convert an integer
/// to Java `byte` in jvalues method.
final class JValueByte {
int value;
JValueByte(this.value);
}
/// Use this class as wrapper to convert an double
/// to Java `float` in jvalues method.
final class JValueFloat {
double value;
JValueFloat(this.value);
}
/// Use this class as wrapper to convert an integer
/// to Java `char` in jvalues method.
final class JValueChar {
int value;
JValueChar(this.value);
}