Ошибка при попытке создать подключение к MongoDB на Android

В общем, при создании connectionString для MongoDB выскакивает ошибка NoClassDefFoundException

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 5336
    java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;
        at com.mongodb.internal.dns.DefaultDnsResolver.createDnsDirContext(DefaultDnsResolver.java:150)
        at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:112)
        at com.mongodb.ConnectionString.<init>(ConnectionString.java:378)
        at com.example.myapplication.RegistrationMenu$2.onClick(RegistrationMenu.java:75)
        at android.view.View.performClick(View.java:8160)
        at android.widget.TextView.performClick(TextView.java:16222)
        at android.view.View.performClickInternal(View.java:8137)
        at android.view.View.access$3700(View.java:888)
        at android.view.View$PerformClick.run(View.java:30236)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8528)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.directory.InitialDirContext" on path: DexPathList[[dex file "/data/data/com.example.myapplication/code_cache/.overlay/base.apk/classes2.dex", zip file "/data/app/~~tzSO7KJKQWB7AUGABGuAWw==/com.example.myapplication-dCwuHIGkzu6J7hey6iXMzA==/base.apk"],nativeLibraryDirectories=[/data/app/~~tzSO7KJKQWB7AUGABGuAWw==/com.example.myapplication-dCwuHIGkzu6J7hey6iXMzA==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
)*

В итоге я выяснил, что в этих классах имеются импорты, которые Android Studio не видит.
Например, java.naming.Context, при этом inteliJ Idea их видит.
Что в такой ситуации делать?

Вот код если что:

connectionString = new ConnectionString("mongodb+srv://Admin:" + adminPassword + "@cluster0.mkskf.mongodb.net/" + databaseName + "?retryWrites=true&w=majority");

Ответы (1 шт):

Автор решения: Михаил Ребров

К сожалению Android не поддерживает все API JDK, в том числе и то API, которое необходимо для использование Java драйвера для подключения к MongoDB. В частности к этому относится отсутствие поддержки javax.naming в Android, с которым Вы столкнулись.

Поэтому их видит Intellij Idea, которая использует полноценный JVM и не видит Android Studio, которая использует реализацию SDK и виртуальную машину, которая используется непосредственно в Android.

И даже если бы Вам удалось обойти эту проблему, позже бы Вы столкнулись с другой.
Помимо javax.naming Android также не поддерживает аутентификацию SCRAM-SHA256, от которой также зависит драйвер MongoDB.

Для решения проблемы предлагается ввести свой слой HTTP REST API поверх MongoDB и использовать его в мобильном приложении.
Таким образом, вся работа с MongoDB остается на сервере.

Либо же использовать платную службу MongoDB Realm, которая предоставляет уже готовый REST API.

Раньше Mongo Inc. предоставляли сервис, который позволял запустить Mongo непосредственно на самом мобильном устройстве, но сейчас на сайте вся информация о нем уже удалена и все ссылки ведущие на него недействительны. (По всей видимости они отказались от поддержки данного проекта.)

Вот тикет в таск-трекере MongoDB, связанный с данной проблемой и ответ сотрудника с рекомендациями, которые приведены в данном ответе

Итого мы имеем следующие варианты:

  • Внедрить слой REST API на сервере и работать с ним
  • Использовать платные готовые решения с готовым REST API (MongoDB Realm)
  • отказаться от использования Mongo DB на мобильных устройствах в пользу другого хранилища
→ Ссылка