diff --git a/app/src/main/jni/nfd-wrapper.cpp b/app/src/main/jni/nfd-wrapper.cpp
index d16049d..a5544a8 100644
--- a/app/src/main/jni/nfd-wrapper.cpp
+++ b/app/src/main/jni/nfd-wrapper.cpp
@@ -192,18 +192,61 @@
 
 static unique_ptr<Runner> g_runner;
 static boost::thread g_thread;
+static std::map<std::string, std::string> g_params;
 
 } // namespace nfd
 
+
+std::map<std::string, std::string>
+getParams(JNIEnv* env, jobject jParams)
+{
+  std::map<std::string, std::string> params;
+
+  jclass jcMap = env->GetObjectClass(jParams);
+  jclass jcSet = env->FindClass("java/util/Set");
+  jclass jcIterator = env->FindClass("java/util/Iterator");
+  jclass jcMapEntry = env->FindClass("java/util/Map$Entry");
+
+  jmethodID jcMapEntrySet      = env->GetMethodID(jcMap,      "entrySet", "()Ljava/util/Set;");
+  jmethodID jcSetIterator      = env->GetMethodID(jcSet,      "iterator", "()Ljava/util/Iterator;");
+  jmethodID jcIteratorHasNext  = env->GetMethodID(jcIterator, "hasNext",  "()Z");
+  jmethodID jcIteratorNext     = env->GetMethodID(jcIterator, "next",     "()Ljava/lang/Object;");
+  jmethodID jcMapEntryGetKey   = env->GetMethodID(jcMapEntry, "getKey",   "()Ljava/lang/Object;");
+  jmethodID jcMapEntryGetValue = env->GetMethodID(jcMapEntry, "getValue", "()Ljava/lang/Object;");
+
+  jobject jParamsEntrySet = env->CallObjectMethod(jParams, jcMapEntrySet);
+  jobject jParamsIterator = env->CallObjectMethod(jParamsEntrySet, jcSetIterator);
+  jboolean bHasNext = env->CallBooleanMethod(jParamsIterator, jcIteratorHasNext);
+  while (bHasNext) {
+    jobject entry = env->CallObjectMethod(jParamsIterator, jcIteratorNext);
+
+    jstring jKey = (jstring)env->CallObjectMethod(entry, jcMapEntryGetKey);
+    jstring jValue = (jstring)env->CallObjectMethod(entry, jcMapEntryGetValue);
+
+    const char* cKey = env->GetStringUTFChars(jKey, nullptr);
+    const char* cValue = env->GetStringUTFChars(jValue, nullptr);
+
+    params.insert(std::make_pair(cKey, cValue));
+
+    env->ReleaseStringUTFChars(jKey, cKey);
+    env->ReleaseStringUTFChars(jValue, cValue);
+
+    bHasNext = env->CallBooleanMethod(jParamsIterator, jcIteratorHasNext);
+  }
+
+  return params;
+}
+
+
 JNIEXPORT void JNICALL
-Java_net_named_1data_nfd_service_NfdService_startNfd(JNIEnv* env, jclass, jstring homePathJ)
+Java_net_named_1data_nfd_service_NfdService_startNfd(JNIEnv* env, jclass, jobject jParams)
 {
   if (nfd::g_runner.get() == nullptr) {
+    nfd::g_params = getParams(env, jParams);
+
     // set/update HOME environment variable
-    const char* homePath = env->GetStringUTFChars(homePathJ, nullptr);
-    ::setenv("HOME", homePath, true);
-    env->ReleaseStringUTFChars(homePathJ, homePath);
-    NFD_LOG_INFO("Use [" << homePath << "] as a security storage");
+    ::setenv("HOME", nfd::g_params["homePath"].c_str(), true);
+    NFD_LOG_INFO("Use [" << nfd::g_params["homePath"] << "] as a security storage");
 
     nfd::g_thread = boost::thread([] {
         NFD_LOG_INFO("Starting NFD...");
@@ -238,3 +281,20 @@
     // do not block anything
   }
 }
+
+JNIEXPORT jobject JNICALL
+Java_net_named_1data_nfd_service_NfdService_getNfdLogModules(JNIEnv* env, jclass)
+{
+  jclass jcLinkedList = env->FindClass("java/util/LinkedList");
+  jmethodID jcLinkedListConstructor = env->GetMethodID(jcLinkedList, "<init>", "()V");
+  jmethodID jcLinkedListAdd = env->GetMethodID(jcLinkedList, "add", "(Ljava/lang/Object;)Z");
+
+  jobject jModules = env->NewObject(jcLinkedList, jcLinkedListConstructor);
+
+  for (const auto& module : nfd::LoggerFactory::getInstance().getModules()) {
+    jstring jModule = env->NewStringUTF(module.c_str());
+    env->CallBooleanMethod(jModules, jcLinkedListAdd, jModule);
+  }
+
+  return jModules;
+}
diff --git a/app/src/main/jni/nfd-wrapper.hpp b/app/src/main/jni/nfd-wrapper.hpp
index 97e3cc1..fcd598d 100644
--- a/app/src/main/jni/nfd-wrapper.hpp
+++ b/app/src/main/jni/nfd-wrapper.hpp
@@ -26,13 +26,14 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+
 /*
  * Class:     net_named_data_nfd_service_NfdService
  * Method:    startNfd
- * Signature: (Ljava/lang/String;)V
+ * Signature: (Ljava/lang/Map;)V
  */
 JNIEXPORT void JNICALL
-Java_net_named_1data_nfd_service_NfdService_startNfd(JNIEnv*, jclass, jstring);
+Java_net_named_1data_nfd_service_NfdService_startNfd(JNIEnv*, jclass, jobject);
 
 /*
  * Class:     net_named_data_nfd_service_NfdService
@@ -42,6 +43,14 @@
 JNIEXPORT void JNICALL
 Java_net_named_1data_nfd_service_NfdService_stopNfd(JNIEnv*, jclass);
 
+/*
+ * Class:     net_named_data_nfd_service_NfdService
+ * Method:    getNfdLogModules
+ * Signature: ()Ljava/util/List;
+ */
+JNIEXPORT jobject JNICALL
+Java_net_named_1data_nfd_service_NfdService_getNfdLogModules(JNIEnv*, jclass);
+
 #ifdef __cplusplus
 }
 #endif
