+
+ CYJavaLocal<jstring> NewString(const jchar *data, jsize size) const {
+ return {jni, _envcall(jni, NewString(data, size))};
+ }
+
+#define CYJavaEnv_(Code) \
+ template <typename... Args_> \
+ void Code(Args_ &&... args) const { \
+ _envcallv(jni, Code(cy::Forward<Args_>(args)...)); \
+ }
+
+#define CYJavaForEachPrimitive_(T, t, Typ, Type, type) \
+ CYJavaEnv_(Get ## Typ ## ArrayRegion) \
+ CYJavaEnv_(Set ## Typ ## Field) \
+ CYJavaEnv_(SetStatic ## Typ ## Field)
+CYJavaForEachPrimitive
+#undef CYJavaForEachPrimitive_
+
+ CYJavaEnv_(CallVoidMethod)
+ CYJavaEnv_(CallStaticVoidMethod)
+ CYJavaEnv_(CallVoidMethodA)
+ CYJavaEnv_(CallStaticVoidMethodA)
+ CYJavaEnv_(SetObjectArrayElement)
+ CYJavaEnv_(SetObjectField)
+ CYJavaEnv_(SetStaticObjectField)
+#undef CYJavaEnv_
+
+#define CYJavaEnv_(Code) \
+ template <typename... Args_> \
+ auto Code(Args_ &&... args) const -> decltype(jni->Code(args...)) { \
+ return _envcall(jni, Code(cy::Forward<Args_>(args)...)); \
+ }
+
+#define CYJavaForEachPrimitive_(T, t, Typ, Type, type) \
+ CYJavaEnv_(Call ## Typ ## Method) \
+ CYJavaEnv_(CallStatic ## Typ ## Method) \
+ CYJavaEnv_(Call ## Typ ## MethodA) \
+ CYJavaEnv_(CallStatic ## Typ ## MethodA) \
+ CYJavaEnv_(Get ## Typ ## Field) \
+ CYJavaEnv_(GetStatic ## Typ ## Field)
+CYJavaForEachPrimitive
+#undef CYJavaForEachPrimitive_
+
+ CYJavaEnv_(FromReflectedField)
+ CYJavaEnv_(FromReflectedMethod)
+ CYJavaEnv_(GetArrayLength)
+ CYJavaEnv_(GetMethodID)
+ CYJavaEnv_(GetStaticMethodID)
+ CYJavaEnv_(IsSameObject)
+#undef CYJavaEnv_
+
+#define CYJavaEnv_(Code) \
+ template <typename Other_, typename... Args_> \
+ auto Code(Args_ &&... args) const -> CYJavaLocal<Other_> { \
+ return {jni, static_cast<Other_>(_envcall(jni, Code(cy::Forward<Args_>(args)...)))}; \
+ }
+
+ CYJavaEnv_(CallObjectMethod)
+ CYJavaEnv_(CallStaticObjectMethod)
+ CYJavaEnv_(CallObjectMethodA)
+ CYJavaEnv_(CallStaticObjectMethodA)
+ CYJavaEnv_(GetObjectArrayElement)
+ CYJavaEnv_(GetObjectField)
+ CYJavaEnv_(GetStaticObjectField)
+#undef CYJavaEnv_