Commit f58c14a7 authored by Max Kellermann's avatar Max Kellermann Committed by Max Kellermann

Java: no namespace indent

parent a52ce7bb
/*
* Copyright 2010-2018 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -36,47 +36,49 @@
#include <cassert>
namespace Java {
/**
* Wrapper for a local "jclass" reference.
*/
class Class : public LocalRef<jclass> {
public:
Class(JNIEnv *env, jclass cls) noexcept
:LocalRef<jclass>(env, cls) {}
Class(JNIEnv *env, const char *name) noexcept
:LocalRef<jclass>(env, env->FindClass(name)) {}
};
/**
* Wrapper for a local "jclass" reference.
*/
class Class : public LocalRef<jclass> {
public:
Class(JNIEnv *env, jclass cls) noexcept
:LocalRef<jclass>(env, cls) {}
Class(JNIEnv *env, const char *name) noexcept
:LocalRef<jclass>(env, env->FindClass(name)) {}
};
/**
* Wrapper for a global "jclass" reference.
*/
class TrivialClass : public TrivialRef<jclass> {
public:
void Find(JNIEnv *env, const char *name) noexcept {
assert(env != nullptr);
assert(name != nullptr);
/**
* Wrapper for a global "jclass" reference.
*/
class TrivialClass : public TrivialRef<jclass> {
public:
void Find(JNIEnv *env, const char *name) noexcept {
assert(env != nullptr);
assert(name != nullptr);
jclass cls = env->FindClass(name);
assert(cls != nullptr);
jclass cls = env->FindClass(name);
assert(cls != nullptr);
Set(env, cls);
env->DeleteLocalRef(cls);
}
Set(env, cls);
env->DeleteLocalRef(cls);
}
bool FindOptional(JNIEnv *env, const char *name) noexcept {
assert(env != nullptr);
assert(name != nullptr);
bool FindOptional(JNIEnv *env, const char *name) noexcept {
assert(env != nullptr);
assert(name != nullptr);
jclass cls = env->FindClass(name);
if (DiscardException(env))
return false;
jclass cls = env->FindClass(name);
if (DiscardException(env))
return false;
Set(env, cls);
env->DeleteLocalRef(cls);
return true;
}
};
Set(env, cls);
env->DeleteLocalRef(cls);
return true;
}
};
}
} // namespace Java
#endif
/*
* Copyright 2010-2019 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......
/*
* Copyright 2010-2019 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -35,28 +35,30 @@
#include <jni.h>
namespace Java {
class Exception : public std::runtime_error {
public:
explicit Exception(JNIEnv *env, jthrowable e) noexcept;
};
/**
* Check if a Java exception has occurred, and if yes, convert
* it to a C++ #Exception and throw that.
*/
void RethrowException(JNIEnv *env);
/**
* Check if an exception has occurred, and discard it.
*
* @return true if an exception was found (and discarded)
*/
static inline bool DiscardException(JNIEnv *env) noexcept {
bool result = env->ExceptionCheck();
if (result)
env->ExceptionClear();
return result;
}
class Exception : public std::runtime_error {
public:
explicit Exception(JNIEnv *env, jthrowable e) noexcept;
};
/**
* Check if a Java exception has occurred, and if yes, convert
* it to a C++ #Exception and throw that.
*/
void RethrowException(JNIEnv *env);
/**
* Check if an exception has occurred, and discard it.
*
* @return true if an exception was found (and discarded)
*/
static inline bool DiscardException(JNIEnv *env) noexcept {
bool result = env->ExceptionCheck();
if (result)
env->ExceptionClear();
return result;
}
} // namespace Java
#endif
/*
* Copyright 2010-2018 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,30 +37,32 @@
class AllocatedPath;
namespace Java {
/**
* Wrapper for a java.io.File object.
*/
class File : public LocalObject {
static jmethodID getAbsolutePath_method;
public:
gcc_nonnull_all
static void Initialise(JNIEnv *env) noexcept;
/**
* Wrapper for a java.io.File object.
*/
class File : public LocalObject {
static jmethodID getAbsolutePath_method;
public:
gcc_nonnull_all
static void Initialise(JNIEnv *env) noexcept;
gcc_nonnull_all
static jstring getAbsolutePath(JNIEnv *env, jobject file) noexcept {
return (jstring)env->CallObjectMethod(file,
getAbsolutePath_method);
}
gcc_nonnull_all
static jstring getAbsolutePath(JNIEnv *env, jobject file) noexcept {
return (jstring)env->CallObjectMethod(file,
getAbsolutePath_method);
}
/**
* Invoke File.getAbsolutePath() and release the
* specified File reference.
*/
gcc_pure gcc_nonnull_all
static AllocatedPath ToAbsolutePath(JNIEnv *env,
jobject file) noexcept;
};
/**
* Invoke File.getAbsolutePath() and release the
* specified File reference.
*/
gcc_pure gcc_nonnull_all
static AllocatedPath ToAbsolutePath(JNIEnv *env,
jobject file) noexcept;
};
}
} // namespace Java
#endif
/*
* Copyright 2010-2018 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -30,10 +30,12 @@
#include "Global.hxx"
namespace Java {
JavaVM *jvm;
void Init(JNIEnv *env) noexcept
{
env->GetJavaVM(&jvm);
}
JavaVM *jvm;
void Init(JNIEnv *env) noexcept
{
env->GetJavaVM(&jvm);
}
} // namespace Java
/*
* Copyright 2010-2018 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -35,24 +35,26 @@
#include <jni.h>
namespace Java {
extern JavaVM *jvm;
void Init(JNIEnv *env) noexcept;
static inline void
DetachCurrentThread() noexcept
{
if (jvm != nullptr)
jvm->DetachCurrentThread();
}
static inline gcc_pure
JNIEnv *GetEnv() noexcept
{
JNIEnv *env;
jvm->AttachCurrentThread(&env, nullptr);
return env;
}
extern JavaVM *jvm;
void Init(JNIEnv *env) noexcept;
static inline void
DetachCurrentThread() noexcept
{
if (jvm != nullptr)
jvm->DetachCurrentThread();
}
static inline gcc_pure
JNIEnv *GetEnv() noexcept
{
JNIEnv *env;
jvm->AttachCurrentThread(&env, nullptr);
return env;
}
} // namespace Java
#endif
/*
* Copyright 2010-2019 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,40 +37,42 @@
#include <cassert>
namespace Java {
/**
* Wrapper for a local "jobject" reference.
*/
typedef LocalRef<jobject> LocalObject;
class GlobalObject : public GlobalRef<jobject> {
public:
/**
* Wrapper for a local "jobject" reference.
* Constructs an uninitialized object. The method
* set() must be called before it is destructed.
*/
typedef LocalRef<jobject> LocalObject;
GlobalObject() = default;
class GlobalObject : public GlobalRef<jobject> {
public:
/**
* Constructs an uninitialized object. The method
* set() must be called before it is destructed.
*/
GlobalObject() = default;
GlobalObject(JNIEnv *env, jobject obj) noexcept
:GlobalRef<jobject>(env, obj) {}
};
GlobalObject(JNIEnv *env, jobject obj) noexcept
:GlobalRef<jobject>(env, obj) {}
};
/**
* Utilities for java.net.Object.
*/
class Object {
static jmethodID toString_method;
/**
* Utilities for java.net.Object.
*/
class Object {
static jmethodID toString_method;
public:
static void Initialise(JNIEnv *env);
public:
static void Initialise(JNIEnv *env);
static jstring toString(JNIEnv *env, jobject o) {
assert(env != nullptr);
assert(o != nullptr);
assert(toString_method != nullptr);
static jstring toString(JNIEnv *env, jobject o) {
assert(env != nullptr);
assert(o != nullptr);
assert(toString_method != nullptr);
return (jstring)env->CallObjectMethod(o, toString_method);
}
};
return (jstring)env->CallObjectMethod(o, toString_method);
}
};
}
} // namespace Java
#endif
/*
* Copyright 2010-2018 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -38,170 +38,172 @@
#include <utility>
namespace Java {
/**
* Hold a local reference on a JNI object.
*/
template<typename T>
class LocalRef {
JNIEnv *env;
T value = nullptr;
public:
LocalRef() noexcept = default;
/**
* Hold a local reference on a JNI object.
* The local reference is obtained by the caller. May
* be nullptr.
*/
template<typename T>
class LocalRef {
JNIEnv *env;
T value = nullptr;
public:
LocalRef() noexcept = default;
/**
* The local reference is obtained by the caller. May
* be nullptr.
*/
LocalRef(JNIEnv *_env, T _value) noexcept
:env(_env), value(_value)
{
assert(env != nullptr);
}
LocalRef(LocalRef &&src) noexcept
:env(src.env),
value(std::exchange(src.value, nullptr)) {}
~LocalRef() noexcept {
if (value != nullptr)
env->DeleteLocalRef(value);
}
LocalRef &operator=(LocalRef &&src) noexcept {
using std::swap;
swap(env, src.env);
swap(value, src.value);
return *this;
}
JNIEnv *GetEnv() const noexcept {
return env;
}
operator bool() const noexcept {
return value != nullptr;
}
T Get() const noexcept {
return value;
}
operator T() const noexcept {
return value;
}
};
LocalRef(JNIEnv *_env, T _value) noexcept
:env(_env), value(_value)
{
assert(env != nullptr);
}
LocalRef(LocalRef &&src) noexcept
:env(src.env),
value(std::exchange(src.value, nullptr)) {}
~LocalRef() noexcept {
if (value != nullptr)
env->DeleteLocalRef(value);
}
LocalRef &operator=(LocalRef &&src) noexcept {
using std::swap;
swap(env, src.env);
swap(value, src.value);
return *this;
}
JNIEnv *GetEnv() const noexcept {
return env;
}
operator bool() const noexcept {
return value != nullptr;
}
T Get() const noexcept {
return value;
}
operator T() const noexcept {
return value;
}
};
/**
* Hold a global reference on a JNI object.
*/
template<typename T>
class GlobalRef {
T value;
public:
/**
* Hold a global reference on a JNI object.
* Constructs an uninitialized object. The method
* set() must be called before it is destructed.
*/
template<typename T>
class GlobalRef {
T value;
public:
/**
* Constructs an uninitialized object. The method
* set() must be called before it is destructed.
*/
GlobalRef() = default;
GlobalRef(JNIEnv *env, T _value) noexcept
:value(_value)
{
assert(env != nullptr);
assert(value != nullptr);
value = (T)env->NewGlobalRef(value);
}
~GlobalRef() noexcept {
GetEnv()->DeleteGlobalRef(value);
}
GlobalRef(const GlobalRef &other) = delete;
GlobalRef &operator=(const GlobalRef &other) = delete;
/**
* Sets the object, ignoring the previous value. This
* is only allowed once after the default constructor
* was used.
*/
void Set(JNIEnv *env, T _value) noexcept {
assert(_value != nullptr);
value = (T)env->NewGlobalRef(_value);
}
T Get() const noexcept {
return value;
}
operator T() const noexcept {
return value;
}
};
GlobalRef() = default;
GlobalRef(JNIEnv *env, T _value) noexcept
:value(_value)
{
assert(env != nullptr);
assert(value != nullptr);
value = (T)env->NewGlobalRef(value);
}
~GlobalRef() noexcept {
GetEnv()->DeleteGlobalRef(value);
}
GlobalRef(const GlobalRef &other) = delete;
GlobalRef &operator=(const GlobalRef &other) = delete;
/**
* Container for a global reference to a JNI object that gets
* initialised and deinitialised explicitly. Since there is
* no implicit initialisation in the default constructor, this
* is a trivial C++ class. It should only be used for global
* variables that are implicitly initialised with zeroes.
* Sets the object, ignoring the previous value. This
* is only allowed once after the default constructor
* was used.
*/
template<typename T>
class TrivialRef {
T value;
public:
TrivialRef() = default;
TrivialRef(const TrivialRef &other) = delete;
TrivialRef &operator=(const TrivialRef &other) = delete;
bool IsDefined() const noexcept {
return value != nullptr;
}
/**
* Obtain a global reference on the specified object
* and store it. This object must not be set already.
*/
void Set(JNIEnv *env, T _value) noexcept {
assert(value == nullptr);
assert(_value != nullptr);
value = (T)env->NewGlobalRef(_value);
}
/**
* Release the global reference and clear this object.
*/
void Clear(JNIEnv *env) noexcept {
assert(value != nullptr);
env->DeleteGlobalRef(value);
value = nullptr;
}
/**
* Release the global reference and clear this object.
* It is allowed to call this method without ever
* calling Set().
*/
void ClearOptional(JNIEnv *env) noexcept {
if (value != nullptr)
Clear(env);
}
T Get() const noexcept {
return value;
}
operator T() const noexcept {
return value;
}
};
}
void Set(JNIEnv *env, T _value) noexcept {
assert(_value != nullptr);
value = (T)env->NewGlobalRef(_value);
}
T Get() const noexcept {
return value;
}
operator T() const noexcept {
return value;
}
};
/**
* Container for a global reference to a JNI object that gets
* initialised and deinitialised explicitly. Since there is
* no implicit initialisation in the default constructor, this
* is a trivial C++ class. It should only be used for global
* variables that are implicitly initialised with zeroes.
*/
template<typename T>
class TrivialRef {
T value;
public:
TrivialRef() = default;
TrivialRef(const TrivialRef &other) = delete;
TrivialRef &operator=(const TrivialRef &other) = delete;
bool IsDefined() const noexcept {
return value != nullptr;
}
/**
* Obtain a global reference on the specified object
* and store it. This object must not be set already.
*/
void Set(JNIEnv *env, T _value) noexcept {
assert(value == nullptr);
assert(_value != nullptr);
value = (T)env->NewGlobalRef(_value);
}
/**
* Release the global reference and clear this object.
*/
void Clear(JNIEnv *env) noexcept {
assert(value != nullptr);
env->DeleteGlobalRef(value);
value = nullptr;
}
/**
* Release the global reference and clear this object.
* It is allowed to call this method without ever
* calling Set().
*/
void ClearOptional(JNIEnv *env) noexcept {
if (value != nullptr)
Clear(env);
}
T Get() const noexcept {
return value;
}
operator T() const noexcept {
return value;
}
};
} // namespace Java
#endif
/*
* Copyright 2010-2019 Max Kellermann <max.kellermann@gmail.com>
* Copyright 2010-2021 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -38,45 +38,47 @@
#include <string>
namespace Java {
/**
* Wrapper for a local "jstring" reference.
*/
class String : public LocalRef<jstring> {
public:
String(JNIEnv *env, jstring value) noexcept
:LocalRef<jstring>(env, value) {}
String(JNIEnv *_env, const char *_value) noexcept
:LocalRef<jstring>(_env, _env->NewStringUTF(_value)) {}
/**
* Wrapper for a local "jstring" reference.
* Copy the value to the specified buffer. Truncates
* the value if it does not fit into the buffer.
*
* @return a pointer to the terminating null byte,
* nullptr on error
*/
class String : public LocalRef<jstring> {
public:
String(JNIEnv *env, jstring value) noexcept
:LocalRef<jstring>(env, value) {}
static char *CopyTo(JNIEnv *env, jstring value,
char *buffer, size_t max_size) noexcept;
String(JNIEnv *_env, const char *_value) noexcept
:LocalRef<jstring>(_env, _env->NewStringUTF(_value)) {}
/**
* Copy the value to the specified buffer. Truncates
* the value if it does not fit into the buffer.
*
* @return a pointer to the terminating null byte,
* nullptr on error
*/
static char *CopyTo(JNIEnv *env, jstring value,
char *buffer, size_t max_size) noexcept;
/**
* Copy the value to the specified buffer. Truncates
* the value if it does not fit into the buffer.
*
* @return a pointer to the terminating null byte,
* nullptr on error
*/
char *CopyTo(JNIEnv *env,
char *buffer, size_t max_size) noexcept {
return CopyTo(env, Get(), buffer, max_size);
}
/**
* Copy the value to the specified buffer. Truncates
* the value if it does not fit into the buffer.
*
* @return a pointer to the terminating null byte,
* nullptr on error
*/
char *CopyTo(JNIEnv *env,
char *buffer, size_t max_size) noexcept {
return CopyTo(env, Get(), buffer, max_size);
}
static std::string ToString(JNIEnv *env, jstring s) noexcept;
static std::string ToString(JNIEnv *env, jstring s) noexcept;
std::string ToString() const noexcept {
return ToString(GetEnv(), Get());
}
};
std::string ToString() const noexcept {
return ToString(GetEnv(), Get());
}
};
}
} // namespace Java
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment