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