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

Я хочу использовать существующую библиотеку 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 ответ

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

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

Другие вопросы по тегам