LINUX.ORG.RU

История изменений

Исправление 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) };
... // Здесь код, который может бросать исключения.
вряд ли увеличится сложность и объем. Даже когда за make_unique_c_string скрывается что-то вроде:
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) };
... // Здесь код, который может бросать исключения.
вряд ли увеличит сложность и объем. Даже когда за make_unique_c_string скрывается что-то вроде:
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}};
}