Use template function c2jni to convert c++ type to jni.

This commit is contained in:
Matthieu Gautier 2020-01-22 17:16:13 +01:00
parent 6099c3113f
commit 6b2f768c8f
2 changed files with 25 additions and 9 deletions

View File

@ -95,7 +95,7 @@ Java_org_kiwix_kiwixlib_JNIKiwixReader_getFileSize(JNIEnv* env, jobject obj)
try { try {
int cSize = READER->getFileSize(); int cSize = READER->getFileSize();
size = c2jni(cSize); size = c2jni(cSize, env);
} catch (std::exception& e) { } catch (std::exception& e) {
__android_log_print(ANDROID_LOG_ERROR, "kiwix", "Unable to get ZIM file size"); __android_log_print(ANDROID_LOG_ERROR, "kiwix", "Unable to get ZIM file size");
__android_log_print(ANDROID_LOG_ERROR, "kiwix", e.what()); __android_log_print(ANDROID_LOG_ERROR, "kiwix", e.what());
@ -234,7 +234,7 @@ JNIEXPORT jstring JNICALL Java_org_kiwix_kiwixlib_JNIKiwixReader_checkUrl(
entry = entry.getFinalEntry(); entry = entry.getFinalEntry();
finalUrl = c2jni(entry.getPath(), env); finalUrl = c2jni(entry.getPath(), env);
} catch (std::exception& e) { } catch (std::exception& e) {
finalUrl = c2jni("", env); finalUrl = c2jni(std::string(), env);
} }
return finalUrl; return finalUrl;
} }
@ -433,7 +433,7 @@ Java_org_kiwix_kiwixlib_JNIKiwixReader_getArticleCount(JNIEnv* env, jobject obj)
jint articleCount = 0; jint articleCount = 0;
try { try {
auto cArticleCount = READER->getArticleCount(); auto cArticleCount = READER->getArticleCount();
articleCount = c2jni(cArticleCount); articleCount = c2jni(cArticleCount, env);
} catch (std::exception& e) { } catch (std::exception& e) {
__android_log_print(ANDROID_LOG_ERROR, "kiwix", "Unable to get article count."); __android_log_print(ANDROID_LOG_ERROR, "kiwix", "Unable to get article count.");
__android_log_print(ANDROID_LOG_ERROR, "kiwix", e.what()); __android_log_print(ANDROID_LOG_ERROR, "kiwix", e.what());
@ -447,7 +447,7 @@ Java_org_kiwix_kiwixlib_JNIKiwixReader_getMediaCount(JNIEnv* env, jobject obj)
jint mediaCount = 0; jint mediaCount = 0;
try { try {
auto cMediaCount = READER->getMediaCount(); auto cMediaCount = READER->getMediaCount();
mediaCount = c2jni(cMediaCount); mediaCount = c2jni(cMediaCount, env);
} catch (std::exception& e) { } catch (std::exception& e) {
__android_log_print(ANDROID_LOG_ERROR, "kiwix", "Unable to get media count."); __android_log_print(ANDROID_LOG_ERROR, "kiwix", "Unable to get media count.");
__android_log_print(ANDROID_LOG_ERROR, "kiwix", e.what()); __android_log_print(ANDROID_LOG_ERROR, "kiwix", e.what());

View File

@ -93,15 +93,31 @@ struct LockedHandle : public Lock {
operator bool() const { return (h->h != nullptr); } operator bool() const { return (h->h != nullptr); }
}; };
/* c2jni type conversion functions */ template<typename T>
inline jboolean c2jni(const bool& val) { return val ? JNI_TRUE : JNI_FALSE; } struct JType { };
template<> struct JType<bool>{ typedef jboolean type_t; };
template<> struct JType<int>{ typedef jint type_t; };
template<> struct JType<long>{ typedef jlong type_t; };
template<> struct JType<uint64_t> { typedef jlong type_t; };
template<> struct JType<uint32_t> { typedef jlong type_t; };
template<> struct JType<std::string>{ typedef jstring type_t; };
template<typename T>
inline typename JType<T>::type_t c2jni(const T& val, JNIEnv* env) {
return static_cast<typename JType<T>::type_t>(val);
}
template<>
inline jboolean c2jni(const bool& val, JNIEnv* env) { return val ? JNI_TRUE : JNI_FALSE; }
template<>
inline jstring c2jni(const std::string& val, JNIEnv* env) inline jstring c2jni(const std::string& val, JNIEnv* env)
{ {
return env->NewStringUTF(val.c_str()); return env->NewStringUTF(val.c_str());
} }
inline jint c2jni(const int val) { return (jint)val; }
inline jint c2jni(const unsigned val) { return (unsigned)val; }
/* jni2c type conversion functions */ /* jni2c type conversion functions */
inline bool jni2c(const jboolean& val) { return val == JNI_TRUE; } inline bool jni2c(const jboolean& val) { return val == JNI_TRUE; }
inline std::string jni2c(const jstring& val, JNIEnv* env) inline std::string jni2c(const jstring& val, JNIEnv* env)
@ -141,7 +157,7 @@ inline void setBoolObjValue(const bool value, const jobject obj, JNIEnv* env)
{ {
jclass objClass = env->GetObjectClass(obj); jclass objClass = env->GetObjectClass(obj);
jfieldID objFid = env->GetFieldID(objClass, "value", "Z"); jfieldID objFid = env->GetFieldID(objClass, "value", "Z");
env->SetIntField(obj, objFid, c2jni(value)); env->SetIntField(obj, objFid, c2jni(value, env));
} }
inline void setPairObjValue(const std::string& filename, const int offset, inline void setPairObjValue(const std::string& filename, const int offset,