Разрешение 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 для получения более подробной информации.