java/String: add class StringUTFChars()
This commit is contained in:
parent
56997290d7
commit
9e61bda592
|
@ -35,13 +35,8 @@ char *
|
||||||
Java::String::CopyTo(JNIEnv *env, jstring value,
|
Java::String::CopyTo(JNIEnv *env, jstring value,
|
||||||
char *buffer, size_t max_size) noexcept
|
char *buffer, size_t max_size) noexcept
|
||||||
{
|
{
|
||||||
const char *p = env->GetStringUTFChars(value, nullptr);
|
return CopyTruncateString(buffer, GetUTFChars(env, value).c_str(),
|
||||||
if (p == nullptr)
|
max_size);
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
char *result = CopyTruncateString(buffer, p, max_size);
|
|
||||||
env->ReleaseStringUTFChars(value, p);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
|
@ -50,13 +45,5 @@ Java::String::ToString(JNIEnv *env, jstring s) noexcept
|
||||||
assert(env != nullptr);
|
assert(env != nullptr);
|
||||||
assert(s != nullptr);
|
assert(s != nullptr);
|
||||||
|
|
||||||
const char *p = env->GetStringUTFChars(s, nullptr);
|
return std::string(GetUTFChars(env, s).c_str());
|
||||||
if (p == nullptr)
|
|
||||||
return std::string();
|
|
||||||
|
|
||||||
AtScopeExit(env, s, p) {
|
|
||||||
env->ReleaseStringUTFChars(s, p);
|
|
||||||
};
|
|
||||||
|
|
||||||
return std::string(p);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,46 @@
|
||||||
|
|
||||||
namespace Java {
|
namespace Java {
|
||||||
|
|
||||||
|
class StringUTFChars {
|
||||||
|
JNIEnv *env;
|
||||||
|
jstring string;
|
||||||
|
const char *chars = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
StringUTFChars() noexcept = default;
|
||||||
|
StringUTFChars(std::nullptr_t) noexcept {}
|
||||||
|
|
||||||
|
StringUTFChars(JNIEnv *_env,
|
||||||
|
const jstring _string,
|
||||||
|
const char *const _chars) noexcept
|
||||||
|
:env(_env), string(_string), chars(_chars) {}
|
||||||
|
|
||||||
|
StringUTFChars(StringUTFChars &&src) noexcept
|
||||||
|
:env(src.env), string(src.string),
|
||||||
|
chars(std::exchange(src.chars, nullptr)) {}
|
||||||
|
|
||||||
|
~StringUTFChars() noexcept {
|
||||||
|
if (chars != nullptr)
|
||||||
|
env->ReleaseStringUTFChars(string, chars);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringUTFChars &operator=(StringUTFChars &&src) noexcept {
|
||||||
|
using std::swap;
|
||||||
|
swap(env, src.env);
|
||||||
|
swap(string, src.string);
|
||||||
|
swap(chars, src.chars);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *c_str() const noexcept {
|
||||||
|
return chars;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator bool() const noexcept {
|
||||||
|
return chars != nullptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper for a local "jstring" reference.
|
* Wrapper for a local "jstring" reference.
|
||||||
*/
|
*/
|
||||||
|
@ -49,6 +89,14 @@ public:
|
||||||
String(JNIEnv *_env, const char *_value) noexcept
|
String(JNIEnv *_env, const char *_value) noexcept
|
||||||
:LocalRef<jstring>(_env, _env->NewStringUTF(_value)) {}
|
:LocalRef<jstring>(_env, _env->NewStringUTF(_value)) {}
|
||||||
|
|
||||||
|
static StringUTFChars GetUTFChars(JNIEnv *env, jstring s) noexcept {
|
||||||
|
return {env, s, env->GetStringUTFChars(s, nullptr)};
|
||||||
|
}
|
||||||
|
|
||||||
|
StringUTFChars GetUTFChars() const noexcept {
|
||||||
|
return GetUTFChars(GetEnv(), Get());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy the value to the specified buffer. Truncates
|
* Copy the value to the specified buffer. Truncates
|
||||||
* the value if it does not fit into the buffer.
|
* the value if it does not fit into the buffer.
|
||||||
|
|
Loading…
Reference in New Issue