История изменений
Исправление eao197, (текущая версия) :
Ну я как бы тоже не вчера код писать начал. Но когда в коде видишь что-то вроде:
jstring jname = (jstring)env->GetObjectArrayElement(arr, IDX_NAME);
const char *c_name = env->GetStringUTFChars(jname, JNI_FALSE);
... // Здесь код, который может бросать исключения.
env->ReleaseStringUTFChars(jname, c_name);
unique_c_string_t c_name{ make_unique_c_string(env, arr, IDX_NAME) };
... // Здесь код, который может бросать исключения.
struct unique_c_string_deleter_t {
JNIEnv * env_;
jstring jstr_;
void operator()(const char * c_str) const noexcept {
env_->ReleaseStringUTFChars(jstr_, c_str);
}
};
using unique_c_string_t = std::unique_ptr<const char *, unique_c_string_deleter_t>;
unique_c_string_t make_unique_c_string(JNIEnv * env, jobjectArray arr, int idx) {
auto jstr = static_cast<jstring>(env->GetObjectArrayElement(arr, idx));
return {env->GetStringUTFChars(jstr, JNI_FALSE), unique_c_string_deleter_t{env, jstr}};
}
Исходная версия eao197, :
Ну я как бы тоже не вчера код писать начал. Но когда в коде видишь что-то вроде:
jstring jname = (jstring)env->GetObjectArrayElement(arr, IDX_NAME);
const char *c_name = env->GetStringUTFChars(jname, JNI_FALSE);
... // Здесь код, который может бросать исключения.
env->ReleaseStringUTFChars(jname, c_name);
unique_c_string_t c_name{ make_unique_c_string(env, arr, IDX_NAME) };
... // Здесь код, который может бросать исключения.
struct unique_c_string_deleter_t {
JNIEnv * env_;
jstring jstr_;
void operator()(const char * c_str) const noexcept {
env_->ReleaseStringUTFChars(jstr_, c_str);
}
};
using unique_c_string_t = std::unique_ptr<const char *, unique_c_string_deleter_t>;
unique_c_string_t make_unique_c_string(JNIEnv * env, jobjectArray arr, int idx) {
auto jstr = static_cast<jstring>(env->GetObjectArrayElement(arr, idx));
return {env->GetStringUTFChars(jstr, JNI_FALSE), unique_c_string_deleter_t{env, jstr}};
}