10 #include <type_traits> 17 return env.GetVersion();
24 Wrap<jclass*>(env.DefineClass(name,
Unwrap(loader), buf,
Unwrap(size))));
27 template <
class Array >
29 -> std::enable_if_t< IsArraylike<Array>::value,
jclass& >
43 Wrap<jmethodID*>(env.FromReflectedMethod(
Unwrap(obj))));
49 Wrap<jfieldID*>(env.FromReflectedField(
Unwrap(obj))));
55 Wrap<jobject*>(env.ToReflectedMethod(
Unwrap(clazz),
Unwrap(method), isStatic)));
61 Wrap<jobject*>(env.ToReflectedField(
Unwrap(clazz),
Unwrap(field), isStatic)));
68 Wrap<jclass*>(env.GetSuperclass(
Unwrap(clazz))));
84 [[noreturn]]
inline void ThrowNew(JNIEnv& env,
jclass& clazz,
const char* msg =
nullptr)
92 return env.ExceptionCheck();
97 return Wrap<jthrowable*>(env.ExceptionOccurred());
102 env.ExceptionDescribe();
107 env.ExceptionClear();
110 [[noreturn]]
inline void FatalError(JNIEnv& env,
const char* msg)
127 Wrap<jobject*>(env.PopLocalFrame(
Unwrap(result))));
131 template <
template < RefDeletionMethod >
class Deleter,
class T >
137 throw std::bad_alloc();
144 return NewGlobalRef<DefaultRefDeleter>(env, t);
149 template <
template < RefDeletionMethod >
class Deleter,
class T,
template < RefDeletionMethod >
class WeakDeleter >
157 template <
class T,
template < RefDeletionMethod >
class WeakDeleter >
160 return NewGlobalRef<DefaultRefDeleter>(env, t);
163 template <
class T,
template < RefDeletionMethod >
class Deleter >
166 env.DeleteGlobalRef(
Unwrap(ref.release()));
177 throw std::bad_alloc();
183 template <
class T,
template < RefDeletionMethod >
class WeakDeleter >
194 env.DeleteLocalRef(
Unwrap(ref.release()));
204 template <
template < RefDeletionMethod >
class Deleter,
class T >
207 jobject* obj = Wrap<jobject*>(env.NewWeakGlobalRef(
Unwrap(t)));
210 throw std::bad_alloc();
217 return NewWeakGlobalRef<DefaultRefDeleter>(env, t);
220 template <
class T,
template < RefDeletionMethod >
class Deleter >
223 env.DeleteWeakGlobalRef(
Unwrap(ref.release()));
237 Wrap<jobject*>(env.AllocObject(
Unwrap(clazz))));
240 template <
class... Args >
244 Wrap<jobject*>(env.NewObject(
Unwrap(clazz),
Unwrap(method),
Unwrap(std::forward<Args>(args))...)));
250 Wrap<jclass*>(env.GetObjectClass(
Unwrap(obj))));
256 env.IsInstanceOf(
Unwrap(obj),
Unwrap(clazz))) == JNI_TRUE;
263 Wrap<jmethodID*>(env.GetMethodID(
Unwrap(clazz), name, sig)));
266 template <
class R,
class... Args >
267 std::enable_if_t<!std::is_void<R>::value, R>
274 template <
class R,
class... Args >
275 std::enable_if_t<std::is_void<R>::value, R>
282 template <
class R,
class... Args >
283 std::enable_if_t<!std::is_void<R>::value, R>
290 template <
class R,
class... Args >
291 std::enable_if_t<std::is_void<R>::value, R>
302 Wrap<jfieldID*>(env.GetFieldID(
Unwrap(clazz), name, sig)));
323 Wrap<jmethodID*>(env.GetStaticMethodID(
Unwrap(clazz), name, sig)));
326 template <
class R,
class... Args >
327 std::enable_if_t<!std::is_void<R>::value, R>
334 template <
class R,
class... Args >
335 std::enable_if_t<std::is_void<R>::value, R>
338 env.CallStaticVoidMethod(
Unwrap(clazz),
Unwrap(method),
Unwrap(std::forward<Args>(args))...);
346 Wrap<jfieldID*>(env.GetStaticFieldID(
Unwrap(clazz), name, sig)));
367 Wrap<jstring*>(env.NewString(
Unwrap(chars),
Unwrap(len))));
370 template <
class Array >
372 -> std::enable_if_t< IsArraylike<Array>::value,
jstring& >
380 Wrap<jsize>(env.GetStringLength(
Unwrap(
string))));
385 ::jboolean isCopy = JNI_FALSE;
387 Wrap<const char16_t*>(env.GetStringChars(
Unwrap(
string), &isCopy)));
393 env.ReleaseStringChars(
Unwrap(
string),
Unwrap(chars.release()));
400 Wrap<jstring*>(env.NewStringUTF(bytes)));
406 Wrap<jsize>(env.GetStringUTFLength(
Unwrap(
string))));
411 ::jboolean isCopy = JNI_FALSE;
413 env.GetStringUTFChars(
Unwrap(
string), &isCopy));
419 env.ReleaseStringUTFChars(
Unwrap(
string), chars.release());
429 template <
class Array >
431 -> std::enable_if_t< IsArraylike<Array>::value >
442 template <
class Array >
444 -> std::enable_if_t< IsArraylike<Array>::value >
451 ::jboolean isCopy = JNI_FALSE;
453 Wrap<const char16_t*>(env.GetStringCritical(
Unwrap(
string), &isCopy)));
459 env.ReleaseStringCritical(
Unwrap(
string),
Unwrap(chars.release()));
468 Wrap<jsize>(env.GetArrayLength(
Unwrap(array))));
481 ::jboolean isCopy = JNI_FALSE;
504 ::jboolean isCopy = JNI_FALSE;
506 env.GetPrimitiveArrayCritical(
Unwrap(array), &isCopy));
513 env.ReleasePrimitiveArrayCritical(
Unwrap(array), carray, 0);
520 env.ReleasePrimitiveArrayCritical(
Unwrap(array), carray.release(), JNI_COMMIT);
531 template <
class T,
class Array >
533 -> std::enable_if_t< IsArraylike<Array>::value >
545 template <
class T,
class Array >
547 -> std::enable_if_t< IsArraylike<Array>::value >
562 Wrap<jobject*>(env.GetObjectArrayElement(
Unwrap(array),
Unwrap(index))));
572 template <
class... Methods >
577 env.RegisterNatives(
Unwrap(clazz), unwrapped,
sizeof...(methods)));
600 JavaVM* result =
nullptr;
609 Wrap<jobject*>(env.NewDirectByteBuffer(address,
Unwrap(capacity))));
615 env.GetDirectBufferAddress(
Unwrap(buf)));
621 env.GetDirectBufferCapacity(
Unwrap(buf)));
627 return env.GetObjectRefType(
Unwrap(obj));
637 void** operator()(JNIEnv** env, jint (JavaVM::*)(
void**,
void*))
639 return reinterpret_cast<void**
>(env);
642 JNIEnv** operator()(JNIEnv** env, jint (JavaVM::*)(JNIEnv**,
void*))
661 JNIEnv* env =
nullptr;
version
Definition: types.hpp:82
jobject * PopLocalFrame(JNIEnv &env, UniqueLocalFrame &&frame, jobject *result=nullptr)
Definition: functions.hpp:123
UniqueLocalRef< T > NewLocalRef(JNIEnv &env, T *t)
Definition: functions.hpp:172
std::unique_ptr< T, DefaultRefDeleter<&JNIEnv::DeleteLocalRef > > UniqueLocalRef
Definition: ownership.hpp:55
std::unique_ptr< JNIEnv, LocalFrameDeleter > UniqueLocalFrame
Definition: ownership.hpp:20
jsize GetStringUTFLength(JNIEnv &env, jstring &string)
Definition: functions.hpp:403
void SetField(JNIEnv &env, jobject *obj, jfieldID &field, T value)
Definition: functions.hpp:313
Definition: errors.hpp:58
std::unique_ptr< jobject, MonitorDeleter > UniqueMonitor
Definition: ownership.hpp:201
void CheckJavaExceptionThenErrorCode(JNIEnv &env, jint err)
Definition: errors.hpp:72
UniqueGlobalRef< T, Deleter > NewGlobalRef(JNIEnv &env, T *t)
Definition: functions.hpp:132
void DetachCurrentThread(JavaVM &vm, UniqueEnv &&env)
Definition: functions.hpp:653
jclass & GetObjectClass(JNIEnv &env, jobject &obj)
Definition: functions.hpp:247
UniqueEnv AttachCurrentThread(JavaVM &vm)
Definition: functions.hpp:631
Definition: ownership.hpp:157
std::tuple< UniqueStringCritical, bool > GetStringCritical(JNIEnv &env, jstring &string)
Definition: functions.hpp:449
Definition: ownership.hpp:9
void MonitorExit(JNIEnv &env, UniqueMonitor &&monitor)
Definition: functions.hpp:592
void ExceptionClear(JNIEnv &env)
Definition: functions.hpp:105
std::unique_ptr< const char16_t, StringCharsDeleter > UniqueStringChars
Definition: ownership.hpp:79
void SetArrayRegion(JNIEnv &env, jarray< T > &array, jsize start, jsize len, const T *buf)
Definition: functions.hpp:539
jstring & NewStringUTF(JNIEnv &env, const char *bytes)
Definition: functions.hpp:397
jint GetVersion(JNIEnv &env)
Definition: functions.hpp:15
void ThrowNew(JNIEnv &env, jclass &clazz, const char *msg=nullptr)
Definition: functions.hpp:84
std::enable_if_t<!std::is_void< R >::value, R > CallStaticMethod(JNIEnv &env, jclass &clazz, jmethodID &method, Args &&... args)
Definition: functions.hpp:328
std::unique_ptr< const char16_t, StringCriticalDeleter > UniqueStringCritical
Definition: ownership.hpp:127
jlong GetDirectBufferCapacity(JNIEnv &env, jobject &buf)
Definition: functions.hpp:618
std::enable_if_t<!std::is_void< R >::value, R > CallMethod(JNIEnv &env, jobject *obj, jmethodID &method, Args &&... args)
Definition: functions.hpp:268
bool IsAssignableFrom(JNIEnv &env, jclass &clazz1, jclass &clazz2)
Definition: functions.hpp:71
UniqueLocalFrame PushLocalFrame(JNIEnv &env, jint capacity)
Definition: functions.hpp:117
void SetObjectArrayElement(JNIEnv &env, jarray< jobject > &array, jsize index, jobject *value)
Definition: functions.hpp:565
void GetArrayRegion(JNIEnv &env, jarray< T > &array, jsize start, jsize len, T *buf)
Definition: functions.hpp:525
void ReleaseStringChars(JNIEnv &env, jstring &string, UniqueStringChars &&chars)
Definition: functions.hpp:391
void CheckErrorCode(jint err)
Definition: errors.hpp:43
jarray< jobject > & NewObjectArray(JNIEnv &env, jsize length, jclass &elementClass, jobject *initialElement=nullptr)
Definition: functions.hpp:553
E * ArraylikeData(E(&a)[n])
Definition: arraylike.hpp:28
bool IsSameObject(JNIEnv &env, jobject *ref1, jobject *ref2)
Definition: functions.hpp:228
void SetStaticField(JNIEnv &env, jclass &clazz, jfieldID &field, T value)
Definition: functions.hpp:357
std::tuple< UniqueStringUTFChars, bool > GetStringUTFChars(JNIEnv &env, jstring &string)
Definition: functions.hpp:409
std::enable_if_t<!std::is_void< R >::value, R > CallNonvirtualMethod(JNIEnv &env, jobject *obj, jclass &clazz, jmethodID &method, Args &&... args)
Definition: functions.hpp:284
std::unique_ptr< const char, StringUTFCharsDeleter > UniqueStringUTFChars
Definition: ownership.hpp:103
Definition: ownership.hpp:26
bool ExceptionCheck(JNIEnv &env)
Definition: functions.hpp:90
void UnregisterNatives(JNIEnv &env, jclass &clazz)
Definition: functions.hpp:580
void * GetDirectBufferAddress(JNIEnv &env, jobject &buf)
Definition: functions.hpp:612
auto Wrap(U &&u)
Definition: wrapping.hpp:16
jobject * GetObjectArrayElement(JNIEnv &env, jarray< jobject > &array, jsize index)
Definition: functions.hpp:559
void ReleaseStringCritical(JNIEnv &env, jstring &string, UniqueStringCritical &&chars)
Definition: functions.hpp:457
jobject & NewObject(JNIEnv &env, jclass &clazz, jmethodID &method, Args &&... args)
Definition: functions.hpp:241
void EnsureLocalCapacity(JNIEnv &env, jint capacity)
Definition: functions.hpp:198
jarray< E > & NewArray(JNIEnv &env, jsize length)
Definition: functions.hpp:472
std::tuple< UniqueArrayElements< E >, bool > GetArrayElements(JNIEnv &env, jarray< E > &array)
Definition: functions.hpp:479
jmethodID * FromReflectedMethod(JNIEnv &env, jobject *obj)
Definition: functions.hpp:40
Definition: advanced_ownership.hpp:5
jsize GetStringLength(JNIEnv &env, jstring &string)
Definition: functions.hpp:377
std::unique_ptr< T, Deleter<&JNIEnv::DeleteGlobalRef > > UniqueGlobalRef
Definition: ownership.hpp:47
std::size_t ArraylikeSize(E(&)[n])
Definition: arraylike.hpp:37
jstring & NewString(JNIEnv &env, const char16_t *chars, jsize len)
Definition: functions.hpp:364
Definition: ownership.hpp:204
bool IsInstanceOf(JNIEnv &env, jobject *obj, jclass &clazz)
Definition: functions.hpp:253
void DeleteWeakGlobalRef(JNIEnv &env, UniqueWeakGlobalRef< T, Deleter > &&ref)
Definition: functions.hpp:221
std::size_t jsize
Definition: types.hpp:28
std::unique_ptr< T, Deleter<&JNIEnv::DeleteWeakGlobalRef > > UniqueWeakGlobalRef
Definition: ownership.hpp:50
Definition: ownership.hpp:82
jobject & NewDirectByteBuffer(JNIEnv &env, void *address, jlong capacity)
Definition: functions.hpp:606
Definition: ownership.hpp:58
auto Unwrap(W &&w)
Definition: wrapping.hpp:22
jmethodID & GetMethodID(JNIEnv &env, jclass &clazz, const char *name, const char *sig)
Definition: functions.hpp:260
void ReleaseArrayElements(JNIEnv &env, jarray< E > &array, E *elems)
Definition: functions.hpp:488
UniqueWeakGlobalRef< T, Deleter > NewWeakGlobalRef(JNIEnv &env, T *t)
Definition: functions.hpp:205
jthrowable * ExceptionOccurred(JNIEnv &env)
Definition: functions.hpp:95
std::tuple< UniquePrimitiveArrayCritical< E >, bool > GetPrimitiveArrayCritical(JNIEnv &env, jarray< E > &array)
Definition: functions.hpp:502
jmethodID & GetStaticMethodID(JNIEnv &env, jclass &clazz, const char *name, const char *sig)
Definition: functions.hpp:320
Definition: typed_methods.hpp:7
std::unique_ptr< JNIEnv, JNIEnvDeleter > UniqueEnv
Definition: ownership.hpp:223
std::tuple< UniqueStringChars, bool > GetStringChars(JNIEnv &env, jstring &string)
Definition: functions.hpp:383
void DeleteGlobalRef(JNIEnv &env, UniqueGlobalRef< T, Deleter > &&ref)
Definition: functions.hpp:164
std::unique_ptr< void, PrimitiveArrayCriticalDeleter< E > > UniquePrimitiveArrayCritical
Definition: ownership.hpp:179
std::pointer_traits< ::jmethodID >::element_type jmethodID
Definition: types.hpp:56
Definition: ownership.hpp:106
jsize GetArrayLength(JNIEnv &env, jarray< E > &array)
Definition: functions.hpp:465
void RegisterNatives(JNIEnv &env, jclass &clazz, const Methods &... methods)
Definition: functions.hpp:573
jfieldID * FromReflectedField(JNIEnv &env, jobject *obj)
Definition: functions.hpp:46
void Throw(JNIEnv &env, jthrowable &obj)
Definition: functions.hpp:78
void ReleaseStringUTFChars(JNIEnv &env, jstring &string, UniqueStringUTFChars &&chars)
Definition: functions.hpp:417
Definition: ownership.hpp:182
jclass & FindClass(JNIEnv &env, const char *name)
Definition: functions.hpp:34
R CheckJavaException(JNIEnv &env, R &&r)
Definition: errors.hpp:61
std::unique_ptr< E, ArrayElementsDeleter< E > > UniqueArrayElements
Definition: ownership.hpp:153
jobject & ToReflectedField(JNIEnv &env, jclass &clazz, jfieldID &field, bool isStatic)
Definition: functions.hpp:58
jclass & DefineClass(JNIEnv &env, const char *name, jobject &loader, const jbyte *buf, jsize size)
Definition: functions.hpp:21
T GetStaticField(JNIEnv &env, jclass &clazz, jfieldID &field)
Definition: functions.hpp:350
JNIEnv & GetEnv(JavaVM &vm, version version=jni_version_1_1)
Definition: functions.hpp:659
JavaVM & GetJavaVM(JNIEnv &env)
Definition: functions.hpp:598
T GetField(JNIEnv &env, jobject *obj, jfieldID &field)
Definition: functions.hpp:306
jobjectRefType GetObjectRefType(JNIEnv &env, jobject *obj)
Definition: functions.hpp:625
std::pointer_traits< ::jfieldID >::element_type jfieldID
Definition: types.hpp:55
void ExceptionDescribe(JNIEnv &env)
Definition: functions.hpp:100
jfieldID & GetFieldID(JNIEnv &env, jclass &clazz, const char *name, const char *sig)
Definition: functions.hpp:299
void GetStringRegion(JNIEnv &env, jstring &string, jsize start, jsize len, char16_t *buf)
Definition: functions.hpp:423
jclass * GetSuperclass(JNIEnv &env, jclass &clazz)
Definition: functions.hpp:65
void DeleteLocalRef(JNIEnv &env, UniqueLocalRef< T > &&ref)
Definition: functions.hpp:192
void GetStringUTFRegion(JNIEnv &env, jstring &string, jsize start, jsize len, char *buf)
Definition: functions.hpp:436
jobject & AllocObject(JNIEnv &env, jclass &clazz)
Definition: functions.hpp:234
jfieldID & GetStaticFieldID(JNIEnv &env, jclass &clazz, const char *name, const char *sig)
Definition: functions.hpp:343
void FatalError(JNIEnv &env, const char *msg)
Definition: functions.hpp:110
jobject & ToReflectedMethod(JNIEnv &env, jclass &clazz, jmethodID &method, bool isStatic)
Definition: functions.hpp:52
void ReleasePrimitiveArrayCritical(JNIEnv &env, jarray< E > &array, void *carray)
Definition: functions.hpp:511
Definition: ownership.hpp:131
UniqueMonitor MonitorEnter(JNIEnv &env, jobject *obj)
Definition: functions.hpp:586