Разрешение DNS NDK для Android с помощью libresolv

#android #c #dns #android-ndk #resolv

#Android #c #dns #android-ndk #разрешение

Вопрос:

Я хочу использовать существующую библиотеку C / C в проекте Android. Библиотека содержит вызовы res_query в resolv.h заголовке (libresolv в Linux), который существует в NDK и, согласно Википедии, является частью Android Bionic libc.

Программа выполняет сборку и привязку нормально после удаления явной инструкции по ссылке -lresolv из файла сборки, но разрешение DNS с помощью res_query всегда терпит неудачу (возвращает -1 ).

Для дальнейшей проверки этой проблемы я создал пример программы, используя только один вызов res_query , используя пример проекта C Android Studio:

 #include <jni.h>
#include <android/log.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/nameser.h>
#include <resolv.h>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_cpptest_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    unsigned char buf[128];
    const int result = res_query("example.com", C_IN, T_A, buf, 128);
    if (result < 0) {
        herror(NULL);
        __android_log_print(ANDROID_LOG_DEBUG, "CppTest", "DNS Error %d", h_errno);
        return env->NewStringUTF("DNS: Query failed.");
    }
    else
        return env->NewStringUTF("DNS: Query successful.");
}
  

Эта программа тоже всегда завершается сбоем с помощью result == -1 и h_errno == 2 .

Я пытался предоставить приложению оба android.permission.INTERNET и android.permission.ACCESS_NETWORK_STATE , но безуспешно.

Создав это как простое приложение командной строки C с помощью набора инструментов Android NDK CMake и загрузив его на устройство Android с помощью adb , оно также демонстрирует такое же поведение. Создание точно такого же кода с помощью набора инструментов Linux по умолчанию и выполнение его там работает и возвращает действительный ответ DNS.

Я не могу найти какую-либо документацию или обсуждение онлайн о состоянии resolv.h на Android, кроме этой страницы документации AOSP о распознавателях DNS, имена resolv которых и состояния:

Код в Bionic продолжает существовать по соображениям совместимости приложений

предполагается, что это должно работать в собственном коде приложения.

Я знаю, что большинство систем Android не поставляются с resolv.conf файлом, и это вполне может быть проблемой. Но пуленепробиваемой документации, подтверждающей это, просто не существует. Кто-нибудь знает более конкретно, resolv.h может ли приложения Android NDK выполнять DNS-запросы с использованием системных настроек DNS-сервера имен или нет?

Комментарии:

1. Также возникают проблемы при сборке mongo-c-driver под платформу Android.

Ответ №1:

res_query не поддерживается в API уровня 29 и выше. Вы можете заменить res_query на android_res_nquery и android_res_nresult

Проверьте https://developer.android.com/ndk/reference/group/networking для получения более подробной информации