@@ -24,12 +24,17 @@ std::string convertString(JNIEnv *env, jstring string) {
2424 return cppstring;
2525}
2626
27- std::string getStringField (JNIEnv *env, jclass clazz, const char *name) {
27+ std::string getStringField (JNIEnv *env, jclass clazz, jobject object, const char *name) {
2828 jfieldID field = env->GetFieldID (clazz, name, " Ljava/lang/String;" );
29- auto string = (jstring) env->GetObjectField (clazz , field);
29+ auto string = (jstring) env->GetObjectField (object , field);
3030 return convertString (env, string);
3131}
3232
33+ std::string getStringField (JNIEnv *env, jobject object, const char *name) {
34+ jclass clazz = env->GetObjectClass (object);
35+ return getStringField (env, clazz, object, name);
36+ }
37+
3338}
3439
3540std::optional<odr::Html> s_html;
@@ -41,10 +46,10 @@ Java_at_tomtasche_reader_background_CoreWrapper_setGlobalParams(JNIEnv *env, jcl
4146
4247 jclass paramsClass = env->GetObjectClass (params);
4348
44- std::string odrCoreDataPath = getStringField (env, paramsClass, " coreDataPath" );
45- std::string fontconfigDataPath = getStringField (env, paramsClass, " fontconfigDataPath" );
46- std::string popplerDataPath = getStringField (env, paramsClass, " popplerDataPath" );
47- std::string pdf2htmlexDataPath = getStringField (env, paramsClass, " pdf2htmlexDataPath" );
49+ std::string odrCoreDataPath = getStringField (env, paramsClass, params, " coreDataPath" );
50+ std::string fontconfigDataPath = getStringField (env, paramsClass, params, " fontconfigDataPath" );
51+ std::string popplerDataPath = getStringField (env, paramsClass, params, " popplerDataPath" );
52+ std::string pdf2htmlexDataPath = getStringField (env, paramsClass, params, " pdf2htmlexDataPath" );
4853
4954 odr::GlobalParams::set_odr_core_data_path (odrCoreDataPath);
5055 odr::GlobalParams::set_fontconfig_data_path (fontconfigDataPath);
@@ -62,7 +67,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
6267 jfieldID errorField = env->GetFieldID (resultClass, " errorCode" , " I" );
6368
6469 jclass optionsClass = env->GetObjectClass (options);
65- std::string inputPathCpp = getStringField (env, optionsClass, " inputPath" );
70+ std::string inputPathCpp = getStringField (env, optionsClass, options, " inputPath" );
6671
6772 try {
6873 std::optional<std::string> passwordCpp;
@@ -75,7 +80,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
7580 jfieldID editableField = env->GetFieldID (optionsClass, " editable" , " Z" );
7681 jboolean editable = env->GetBooleanField (options, editableField);
7782
78- std::string outputPathCpp = getStringField (env, optionsClass, " outputPath" );
83+ std::string outputPathCpp = getStringField (env, optionsClass, options, " outputPath" );
7984
8085 jclass listClass = env->FindClass (" java/util/List" );
8186 jmethodID addMethod = env->GetMethodID (listClass, " add" , " (Ljava/lang/Object;)Z" );
@@ -112,15 +117,13 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
112117 fileType = e.file_type ;
113118 }
114119
115- const auto extensionCpp = odr::type_to_string (fileType);
116- const auto extensionC = extensionCpp.c_str ();
117- jstring extension = env->NewStringUTF (extensionC);
118-
120+ std::string extensionCpp = odr::type_to_string (fileType);
121+ jstring extension = env->NewStringUTF (extensionCpp.c_str ());
119122 jfieldID extensionField = env->GetFieldID (resultClass, " extension" ,
120123 " Ljava/lang/String;" );
121124 env->SetObjectField (result, extensionField, extension);
122125
123- // __android_log_print(ANDROID_LOG_VERBOSE, "smn", "%s", extensionCpp .c_str());
126+ __android_log_print (ANDROID_LOG_VERBOSE, " smn" , " Open %s" , inputPathCpp .c_str ());
124127
125128 const auto file = odr::open (inputPathCpp);
126129 const auto fileCategory = odr::category_by_type (file.file_type ());
@@ -154,25 +157,20 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
154157 }
155158 }
156159
160+ extensionCpp = odr::type_to_string (file.file_type ());
161+ extension = env->NewStringUTF (extensionCpp.c_str ());
162+ env->SetObjectField (result, extensionField, extension);
163+
157164 odr::HtmlConfig config;
158165 config.editable = editable;
159166
160167 if (paging) {
161168 config.text_document_margin = true ;
162169 }
163170
164- s_html = odr::html::translate (file, outputPathCpp, config );
171+ __android_log_print (ANDROID_LOG_VERBOSE, " smn " , " Translate to HTML " );
165172
166- {
167- const auto extensionCpp = odr::type_to_string (
168- s_html->file_type ());
169- const auto extensionC = extensionCpp.c_str ();
170- jstring extension = env->NewStringUTF (extensionC);
171-
172- jfieldID extensionField = env->GetFieldID (resultClass, " extension" ,
173- " Ljava/lang/String;" );
174- env->SetObjectField (result, extensionField, extension);
175- }
173+ s_html = odr::html::translate (file, outputPathCpp, config);
176174
177175 for (auto &&page: s_html->pages ()) {
178176 jstring pageName = env->NewStringUTF (page.name .c_str ());
@@ -181,13 +179,20 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
181179 jstring pagePath = env->NewStringUTF (page.path .c_str ());
182180 env->CallBooleanMethod (pagePaths, addMethod, pagePath);
183181 }
184- } catch (odr::UnknownFileType &) {
182+ } catch (const odr::UnknownFileType &e) {
183+ __android_log_print (ANDROID_LOG_ERROR, " smn" , " Unknown file type: %s" , e.what ());
185184 env->SetIntField (result, errorField, -5 );
186185 return result;
187- } catch (odr::UnsupportedFileType &) {
186+ } catch (const odr::UnsupportedFileType &e) {
187+ __android_log_print (ANDROID_LOG_ERROR, " smn" , " Unsupported file type: %s" , e.what ());
188188 env->SetIntField (result, errorField, -5 );
189189 return result;
190+ } catch (const std::exception &e) {
191+ __android_log_print (ANDROID_LOG_ERROR, " smn" , " Unhandled C++ exception: %s" , e.what ());
192+ env->SetIntField (result, errorField, -4 );
193+ return result;
190194 } catch (...) {
195+ __android_log_print (ANDROID_LOG_ERROR, " smn" , " Unhandled C++ exception without further information" );
191196 env->SetIntField (result, errorField, -4 );
192197 return result;
193198 }
@@ -204,16 +209,14 @@ JNIEXPORT jobject JNICALL
204209Java_at_tomtasche_reader_background_CoreWrapper_backtranslateNative (JNIEnv *env, jclass clazz,
205210 jobject options,
206211 jstring htmlDiff) {
207- jclass optionsClass = env->GetObjectClass (options);
208-
209212 jclass resultClass = env->FindClass (" at/tomtasche/reader/background/CoreWrapper$CoreResult" );
210213 jmethodID resultConstructor = env->GetMethodID (resultClass, " <init>" , " ()V" );
211214 jobject result = env->NewObject (resultClass, resultConstructor);
212215
213216 jfieldID errorField = env->GetFieldID (resultClass, " errorCode" , " I" );
214217
215218 try {
216- std::string outputPathPrefixCpp = getStringField (env, optionsClass , " outputPath" );
219+ std::string outputPathPrefixCpp = getStringField (env, options , " outputPath" );
217220
218221 jboolean isCopy;
219222 const auto htmlDiffC = env->GetStringUTFChars (htmlDiff, &isCopy);
@@ -262,6 +265,8 @@ std::optional<odr::HttpServer> s_server;
262265
263266JNIEXPORT void JNICALL
264267Java_at_tomtasche_reader_background_CoreWrapper_createServer (JNIEnv *env, jclass clazz, jstring outputPath) {
268+ __android_log_print (ANDROID_LOG_INFO, " smn" , " create server" );
269+
265270 std::string output_path = convertString (env, outputPath);
266271
267272 std::filesystem::create_directories (output_path);
@@ -273,34 +278,37 @@ Java_at_tomtasche_reader_background_CoreWrapper_createServer(JNIEnv *env, jclass
273278
274279JNIEXPORT void JNICALL
275280Java_at_tomtasche_reader_background_CoreWrapper_hostFile (JNIEnv *env, jclass clazz, jstring prefix, jobject options) {
276- jboolean isCopy;
277-
278- jclass optionsClass = env->GetObjectClass (options);
281+ __android_log_print (ANDROID_LOG_INFO, " smn" , " host file" );
279282
280- std::string inputPathCpp = getStringField (env, optionsClass , " inputPath" );
283+ std::string inputPathCpp = getStringField (env, options , " inputPath" );
281284 std::string prefixCpp = convertString (env, prefix);
282285
283286 odr::DecodePreference decodePreference;
284- decodePreference.engine_priority = {
285- odr::DecoderEngine::poppler, odr::DecoderEngine::wvware, odr::DecoderEngine::odr};
287+ decodePreference.engine_priority = {odr::DecoderEngine::poppler, odr::DecoderEngine::wvware, odr::DecoderEngine::odr};
286288 odr::DecodedFile file = odr::open (inputPathCpp, decodePreference);
287289
288- __android_log_print (ANDROID_LOG_INFO, " smn" , " file type %i" , file.file_type ());
289-
290290 try {
291291 s_server->serve_file (file, prefixCpp, odr::HtmlConfig ());
292+ } catch (const std::exception &e) {
293+ __android_log_print (ANDROID_LOG_ERROR, " smn" , " Unhandled C++ exception: %s" , e.what ());
292294 } catch (...) {
293- __android_log_print (ANDROID_LOG_ERROR, " smn" , " error " );
295+ __android_log_print (ANDROID_LOG_ERROR, " smn" , " Unhandled C++ exception without further information " );
294296 }
295297}
296298
297299JNIEXPORT void JNICALL
298300Java_at_tomtasche_reader_background_CoreWrapper_listenServer (JNIEnv *env, jclass clazz, jint port) {
301+ __android_log_print (ANDROID_LOG_INFO, " smn" , " listen ..." );
302+
299303 s_server->listen (" 127.0.0.1" , port);
304+
305+ __android_log_print (ANDROID_LOG_INFO, " smn" , " done listening" );
300306}
301307
302308JNIEXPORT void JNICALL
303309Java_at_tomtasche_reader_background_CoreWrapper_stopServer (JNIEnv *env, jclass clazz) {
310+ __android_log_print (ANDROID_LOG_INFO, " smn" , " stop server" );
311+
304312 s_server->stop ();
305313 s_server.reset ();
306314}
0 commit comments