11 #include <type_traits> 15 template <
class M,
class Enable =
void >
18 template <
class R,
class... Args >
25 template <
class R,
class... Args >
29 template <
class T,
class R,
class... Args >
33 template <
class T,
class R,
class... Args >
46 std::enable_if_t< std::is_class<M>::value >* =
nullptr)
51 static FunctionType* method = m;
53 auto wrapper = [] (JNIEnv* env,
auto... args)
57 return method(env, args...);
72 template <
class M, M method >
78 auto wrapper = [] (JNIEnv* env,
auto... args)
82 return method(env, args...);
97 template <
class T, T*... >
100 template <
class T,
class R,
class Subject,
class... Args >
117 template <
class T,
class Subject,
class... Args >
127 method(*env,
AsLvalue(
Tag<std::decay_t<Subject>>(*env, *subject)),
AsLvalue(
Tag<std::decay_t<Args>>(*env, args))...);
143 template <
class R,
class Subject,
class... Args, R (*method)(JNIEnv&, Subject, Args...) >
157 template <
class Subject,
class... Args, void (*method)(JNIEnv&, Subject, Args...) >
164 method(*env,
AsLvalue(
Tag<std::decay_t<Subject>>(*env, *subject)),
AsLvalue(
Tag<std::decay_t<Args>>(*env, args))...);
171 template <
class M, M method >
181 template <
class L,
class >
184 template <
class L,
class R,
class P,
class... Args >
196 template < class Peer, class TagType, class = std::enable_if_t< std::is_same<P, Peer>::value > >
199 auto wrapper = [field, lambda = lambda] (JNIEnv& env,
Object<TagType>& obj, Args... args)
201 return lambda(env, *reinterpret_cast<P*>(obj.Get(env, field)), args...);
210 std::enable_if_t< std::is_class<L>::value >* =
nullptr)
218 template <
class M, M* >
221 template <
class R,
class P,
class... Args, R (*method)(JNIEnv&, P&, Args...) >
232 template < class Peer, class TagType, class = std::enable_if_t< std::is_same<P, Peer>::value > >
235 auto wrapper = [field] (JNIEnv& env,
Object<TagType>& obj, Args... args)
237 return method(env, *reinterpret_cast<P*>(obj.Get(env, field)), args...);
244 template <
class M, M method >
246 std::enable_if_t< !std::is_member_function_pointer<M>::value >* =
nullptr)
255 template <
class M, M >
258 template <
class R,
class P,
class... Args, R (P::*method)(JNIEnv&, Args...) >
269 template < class Peer, class TagType, class = std::enable_if_t< std::is_same<P, Peer>::value > >
272 auto wrapper = [field] (JNIEnv& env,
Object<TagType>& obj, Args... args)
274 return (reinterpret_cast<P*>(obj.Get(env, field))->*method)(env, args...);
281 template <
class M, M method >
283 std::enable_if_t< std::is_member_function_pointer<M>::value >* =
nullptr)
310 template <
class Peer,
class TagType,
class... Methods >
314 RegisterNatives(env, *clazz, methods.template
operator()<Peer>(field)...);
317 template <
class Peer,
class TagType,
class >
320 template <
class Peer,
class TagType,
class... Args >
328 auto wrapper = [field, initializer] (JNIEnv& e,
Object<TagType>& obj, std::decay_t<Args>&... args)
330 UniquePeer previous(reinterpret_cast<Peer*>(obj.Get(e, field)));
332 obj.Set(e, field, reinterpret_cast<jlong>(instance.get()));
343 UniquePeer instance(reinterpret_cast<Peer*>(obj.Get(e, field)));
344 if (instance) obj.Set(e, field, jlong(0));
352 template <
class Peer,
class TagType,
class Initializer,
class... Methods >
354 Initializer initialize,
355 const char* initializeMethodName,
356 const char* finalizeMethodName,
357 Methods&&... methods)
365 helper.MakeInitializer(field, initializeMethodName, initialize),
366 helper.MakeFinalizer(field, finalizeMethodName),
367 methods.template operator()<Peer>(field)...);
372 template <
class Peer,
class... Args >
373 std::unique_ptr<Peer>
MakePeer(jni::JNIEnv& env, Args... args)
375 return std::make_unique<Peer>(env, args...);
decltype(Untag(std::declval< T >())) UntaggedType
Definition: tagging.hpp:130
void RegisterNativePeer(JNIEnv &env, const Class< TagType > &clazz, const char *fieldName, Methods &&... methods)
Definition: native_method.hpp:311
auto operator()(const char *name)
Definition: native_method.hpp:160
auto MakeInitializer(const Field< TagType, jlong > &field, const char *name, Initializer *initializer) const
Definition: native_method.hpp:326
High-level peer, lambda.
Definition: native_method.hpp:182
auto MakeNativePeerMethod(const char *name, const L &lambda, std::enable_if_t< std::is_class< L >::value > *=nullptr)
Definition: native_method.hpp:209
auto ReleaseUnique(T primitive)
Definition: unique.hpp:143
auto operator()(const char *name)
Definition: native_method.hpp:146
auto operator()(const char *name, const M &m)
Definition: native_method.hpp:121
auto operator()(const char *name, const M &m)
Definition: native_method.hpp:104
auto operator()(const Field< TagType, jlong > &field)
Definition: native_method.hpp:197
std::unique_ptr< Peer > UniquePeer
Definition: native_method.hpp:323
void ThrowJavaError(JNIEnv &env, std::exception_ptr e)
Definition: errors.hpp:101
auto MakeNativeMethod(const char *name, const char *sig, const M &m, std::enable_if_t< std::is_class< M >::value > *=nullptr)
Low-level, lambda.
Definition: native_method.hpp:45
Definition: object.hpp:44
Definition: advanced_ownership.hpp:5
Definition: native_method.hpp:16
UniquePeer(JNIEnv &, Args...) Initializer
Definition: native_method.hpp:324
NativePeerMemberFunctionMethod(const char *n)
Definition: native_method.hpp:265
NativePeerLambdaMethod(const char *n, const L &l)
Definition: native_method.hpp:192
auto MakeFinalizer(const Field< TagType, jlong > &field, const char *name) const
Definition: native_method.hpp:339
High-level peer, function pointer.
Definition: native_method.hpp:219
typename RemoveUnique< T >::Type RemoveUniqueType
Definition: unique.hpp:139
auto operator()(const Field< TagType, jlong > &field)
Definition: native_method.hpp:233
std::unique_ptr< Peer > MakePeer(jni::JNIEnv &env, Args... args)
Definition: native_method.hpp:373
T & AsLvalue(T &&x)
Definition: traits.hpp:33
R ResultType
Definition: native_method.hpp:22
High-level peer, member function pointer.
Definition: native_method.hpp:256
void RegisterNatives(JNIEnv &env, jclass &clazz, const Methods &... methods)
Definition: functions.hpp:573
auto operator()(const Field< TagType, jlong > &field)
Definition: native_method.hpp:270
High-level, lambda.
Definition: native_method.hpp:98
auto Tag(JNIEnv &, T primitive) -> std::enable_if_t< IsPrimitive< T >::value, T >
Definition: tagging.hpp:94
R(Args...) Type
Definition: native_method.hpp:21
Definition: native_method.hpp:318
NativePeerFunctionPointerMethod(const char *n)
Definition: native_method.hpp:228
Definition: tagging.hpp:13