我想在Android项目中使用现有的C/C++库。这个库在res_query头(Linux上的libresolv)中包含对resolv.h的调用,它存在于resolv.h中,根据维基百科的说法,它是Android仿生libc的一部分。
在从生成文件中删除显式链接指令-lresolv后,程序生成并链接良好,但是res_query的DNS解析总是失败(返回-1)。
为了进一步检查这个问题,我使用Android的示例res_query项目构建了一个只使用一个对C++的调用的示例程序:
#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都给了应用程序,但都没有成功。
使用Android工具链将其构建为一个简单的C命令行应用程序,并使用adb将其推到Android设备上,它也会表现出相同的行为。使用默认的Linux工具链构建完全相同的代码,并在那里执行它,并返回有效的DNS响应。
我在网上找不到任何关于安卓上resolv.h状态的文档或讨论,除了有关DNS解析器的AOSP文档页,它的名称是resolv,并声明:
由于应用程序兼容性的原因,仿生代码继续存在。
建议它应该在本地应用程序代码中工作。
我知道大多数Android系统都没有附带resolv.conf文件,这很可能就是问题所在。但声明这一点的防弹文档根本不存在。有没有人更具体地知道resolv.h 是否可以在Android应用程序中使用系统提供的DNS名称服务器设置来进行DNS查询?
发布于 2021-08-17 15:40:28
在API级别29和更高版本中不支持res_query。您可以用android_res_nquery和android_res_nresult替换res_query。
查看https://developer.android.com/ndk/reference/group/networking以获得更多详细信息
https://stackoverflow.com/questions/63486579
复制相似问题