首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于libresolv的Android解析

基于libresolv的Android解析
EN

Stack Overflow用户
提问于 2020-08-19 12:04:47
回答 1查看 669关注 0票数 1

我想在Android项目中使用现有的C/C++库。这个库在res_query头(Linux上的libresolv)中包含对resolv.h的调用,它存在于resolv.h中,根据维基百科的说法,它是Android仿生libc的一部分。

在从生成文件中删除显式链接指令-lresolv后,程序生成并链接良好,但是res_query的DNS解析总是失败(返回-1)。

为了进一步检查这个问题,我使用Android的示例res_query项目构建了一个只使用一个对C++的调用的示例程序:

代码语言:javascript
复制
#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 == -1h_errno == 2中也总是失败。

我试着把android.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATE都给了应用程序,但都没有成功。

使用Android工具链将其构建为一个简单的C命令行应用程序,并使用adb将其推到Android设备上,它也会表现出相同的行为。使用默认的Linux工具链构建完全相同的代码,并在那里执行它,并返回有效的DNS响应。

我在网上找不到任何关于安卓上resolv.h状态的文档或讨论,除了有关DNS解析器的AOSP文档页,它的名称是resolv,并声明:

由于应用程序兼容性的原因,仿生代码继续存在。

建议它应该在本地应用程序代码中工作。

我知道大多数Android系统都没有附带resolv.conf文件,这很可能就是问题所在。但声明这一点的防弹文档根本不存在。有没有人更具体地知道resolv.h 是否可以在Android应用程序中使用系统提供的DNS名称服务器设置来进行DNS查询?

EN

回答 1

Stack Overflow用户

发布于 2021-08-17 15:40:28

在API级别29和更高版本中不支持res_query。您可以用android_res_nqueryandroid_res_nresult替换res_query

查看https://developer.android.com/ndk/reference/group/networking以获得更多详细信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63486579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档