25#include "../abi/string.hpp"
26#include "../abi/vector.hpp"
27#include "../boolean.hpp"
28#include "../compat.hpp"
29#include "../functional.hpp"
30#include "../zstring_view.hpp"
31#include "common_types.hpp"
32#include "global_ref.hpp"
33#include "iterator.hpp"
34#include "local_ref.hpp"
48namespace essence::jni {
49 using jobject_bit_transformer_type = std::function<local_ref(
const std::byte* source)>;
56 std::ranges::contiguous_range<T> && std::convertible_to<std::ranges::range_value_t<T>, std::string_view>;
58 ES_API(JNISUPPORT) global_ref_ex<jclass> get_jstring_class();
59 ES_API(JNISUPPORT) global_ref_ex<jclass> get_exception_class();
61 ES_API(JNISUPPORT) abi::string from_string(jstring str);
62 ES_API(JNISUPPORT) abi::vector<jboolean> from_array(jbooleanArray array);
63 ES_API(JNISUPPORT) abi::vector<jbyte> from_array(jbyteArray array);
64 ES_API(JNISUPPORT) abi::vector<jshort> from_array(jshortArray array);
65 ES_API(JNISUPPORT) abi::vector<jint> from_array(jintArray array);
66 ES_API(JNISUPPORT) abi::vector<jlong> from_array(jlongArray array);
67 ES_API(JNISUPPORT) abi::vector<jchar> from_array(jcharArray array);
68 ES_API(JNISUPPORT) abi::vector<float> from_array(jfloatArray array);
69 ES_API(JNISUPPORT) abi::vector<double> from_array(jdoubleArray array);
70 ES_API(JNISUPPORT) abi::vector<local_ref> from_array(jobjectArray array);
71 ES_API(JNISUPPORT) abi::vector<abi::string> from_string_array(jobjectArray array);
73 template <std::invocable<const local_ref&> Transformer>
74 requires(!std::is_void_v<typename function_traits<Transformer>::return_type>)
75 auto from_array(jobjectArray array, Transformer&& transformer) {
76 using result_type = abi::vector<typename function_traits<Transformer>::return_type>;
78 if (convert_to_boolean(transformer)) {
79 jobject_array_proxy proxy{array};
80 auto intermediate = proxy | std::views::transform(std::forward<Transformer>(transformer));
82 return result_type{intermediate.begin(), intermediate.end()};
88 ES_API(JNISUPPORT) jstring make_string(std::string_view str);
89 ES_API(JNISUPPORT) jbooleanArray make_array(std::span<const bool> buffer);
90 ES_API(JNISUPPORT) jbyteArray make_array(std::span<const std::byte> buffer);
91 ES_API(JNISUPPORT) jbyteArray make_array(std::span<const std::int8_t> buffer);
92 ES_API(JNISUPPORT) jshortArray make_array(std::span<const std::int16_t> buffer);
93 ES_API(JNISUPPORT) jintArray make_array(std::span<const std::int32_t> buffer);
94 ES_API(JNISUPPORT) jlongArray make_array(std::span<const std::int64_t> buffer);
95 ES_API(JNISUPPORT) jbyteArray make_array(std::span<const std::uint8_t> buffer);
96 ES_API(JNISUPPORT) jcharArray make_array(std::span<const std::uint16_t> buffer);
97 ES_API(JNISUPPORT) jfloatArray make_array(std::span<const float> buffer);
98 ES_API(JNISUPPORT) jdoubleArray make_array(std::span<const double> buffer);
100 ES_API(JNISUPPORT) jintArray make_array(std::span<const long> buffer);
103 jobjectArray make_array(jclass class_id, std::span<const std::byte> buffer, std::size_t unit_size,
104 const jobject_bit_transformer_type& transformer);
106 jobject make_object_unsafe(jclass class_id, jmethodID ctor, ...);
108 template <std::ranges::contiguous_range Range,
typename Transformer>
109 requires std::is_invocable_r_v<local_ref, Transformer, const std::ranges::range_reference_t<Range>>
110 jobjectArray make_array(jclass class_id, Range&& range, Transformer&& transformer) {
111 if (!convert_to_boolean(transformer)) {
115 return make_array(class_id, std::as_bytes(std::span{range}),
sizeof(std::ranges::range_value_t<Range>),
116 [&](
const std::byte* source) {
117 return std::forward<Transformer>(transformer)(
118 *std::launder(
reinterpret_cast<const std::ranges::range_value_t<Range>*
>(source)));
122 template <jni_arg_with_scoped... Args>
123 jobject make_object(jclass class_id, jmethodID ctor, Args&&... args) {
124 static constexpr auto parse_arg = []<jni_arg_with_scoped T>(T&& arg) ->
decltype(
auto) {
125 if constexpr (local_ref_like<T>) {
126 return static_cast<const local_ref&
>(std::forward<T>(arg)).get();
127 }
else if constexpr (global_ref_like<T>) {
128 return static_cast<const global_ref&
>(std::forward<T>(arg)).get();
130 return std::forward<T>(arg);
134 return make_object_unsafe(class_id, ctor, parse_arg(std::forward<Args>(args))...);
137 ES_API(JNISUPPORT) jint throw_exception(
const std::exception& ex);
138 ES_API(JNISUPPORT) jint throw_exception(jclass exception_type, zstring_view message);
140 template <std::default_initializable T>
141 T throw_exception(jclass exception_type, zstring_view message, T value = {}) {
142 static_assert(
sizeof(T) <= 32);
143 static_cast<void>(throw_exception(exception_type, message));
145 return std::move(value);
148 template <std::default_initializable T>
149 T throw_exception(
const std::exception& ex, T value = {}) {
150 static_assert(
sizeof(T) <= 32);
151 static_cast<void>(throw_exception(ex));
153 return std::move(value);
157namespace essence::jni::scoped {
158 ES_API(JNISUPPORT) local_ref_ex<jstring> make_string(std::string_view str);
159 ES_API(JNISUPPORT) local_ref_ex<jbooleanArray> make_array(std::span<const bool> buffer);
160 ES_API(JNISUPPORT) local_ref_ex<jbyteArray> make_array(std::span<const std::byte> buffer);
161 ES_API(JNISUPPORT) local_ref_ex<jbyteArray> make_array(std::span<const std::int8_t> buffer);
162 ES_API(JNISUPPORT) local_ref_ex<jshortArray> make_array(std::span<const std::int16_t> buffer);
163 ES_API(JNISUPPORT) local_ref_ex<jintArray> make_array(std::span<const std::int32_t> buffer);
164 ES_API(JNISUPPORT) local_ref_ex<jlongArray> make_array(std::span<const std::int64_t> buffer);
165 ES_API(JNISUPPORT) local_ref_ex<jbyteArray> make_array(std::span<const std::uint8_t> buffer);
166 ES_API(JNISUPPORT) local_ref_ex<jcharArray> make_array(std::span<const std::uint16_t> buffer);
167 ES_API(JNISUPPORT) local_ref_ex<jfloatArray> make_array(std::span<const float> buffer);
168 ES_API(JNISUPPORT) local_ref_ex<jdoubleArray> make_array(std::span<const double> buffer);
170 ES_API(JNISUPPORT) local_ref_ex<jintArray> make_array(std::span<const long> buffer);
173 local_ref_ex<jobjectArray> make_array(jclass class_id, std::span<const std::byte> buffer, std::size_t unit_size,
174 const jobject_bit_transformer_type& transformer);
176 template <std::ranges::contiguous_range Range,
typename Transformer>
177 requires std::is_invocable_r_v<local_ref, Transformer, const std::ranges::range_reference_t<Range>>
178 local_ref_ex<jobjectArray> make_array(jclass class_id, Range&& range, Transformer&& transformer) {
179 return local_ref_ex<jobjectArray>{
180 jni::make_array(class_id, range, std::forward<Transformer>(transformer)),
true};
183 template <jni_arg_with_scoped... Args>
184 local_ref make_object(jclass class_id, jmethodID ctor, Args&&... args) {
185 return local_ref{jni::make_object(class_id, ctor, std::forward<Args>(args)...),
true};
189namespace essence::jni {
190 template <
string_view_able_range Range>
191 jobjectArray make_array(Range&& range) {
193 get_jstring_class().get(), range, [](std::string_view inner) {
return scoped::make_string(inner); });
197namespace essence::jni::scoped {
198 template <
string_view_able_range Range>
199 local_ref_ex<jobjectArray> make_array(Range&& range) {
200 return local_ref_ex<jobjectArray>{jni::make_array(range),
true};
Definition global_ref.hpp:54
Definition common_types.hpp:53
Definition local_ref.hpp:54