Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1098598
  • 博文数量: 276
  • 博客积分: 8317
  • 博客等级: 少将
  • 技术积分: 2329
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-12 08:17
个人简介

http://ads.buzzcity.net/adpage.php?partnerid=40096

文章分类

全部博文(276)

文章存档

2013年(1)

2012年(38)

2011年(102)

2010年(85)

2009年(45)

2008年(5)

分类: LINUX

2010-04-14 23:19:50

最近做一个项目,模块分前后台,前台UI用java,后台核心服务用c/c++,分别是两个进程。但是后台由前台启动。其中遇到一个问题,后台核心服务需要调用gethostbyname来访问DNS相关内容,调试发现每次都失败。一开始我们怀疑是权限问题,但是发现AndroidManifest.xml里面已经加上了网络相关的权限。

   
   
几个人一起测试规律,发现如果gethostbyname写在jni里面,然后java调用jni成功。如果由java直接启动本地exec则失败。改用jni启动本地exec后,发现也失败。jni调用采取fork + exec的方式。

java -> jni -> gethostbyname 成功
java -> jni -> exec -> gethostbyname 失败
java -> exec -> gethostbyname 失败
java -> jni -> fork -> gethostbyname 成功

没有头绪,于是求教google,发现网上也有人遇到同样问题,说是如果
exec -> fork -> exec -> gethostbyname 失败
exec -> gethostbyname 成功
exec -> system -> gethostbyname成功
那么 system 和 fork + exec方式有什么区别呢?
是否权限的问题?

无解,最后一招,硬着头皮去看源代码了,
查看gethostbyname的源代码
bionic/libc/netbsd/gethnamaddr.c
gethostbyname -> __res_get_state -> _res_thread_get -> __system_property_find
看来DNS的信息和android的property system搭上边了。会不会是访问property system权限的问题呢?呵呵!
接着往下看bionic/libc/bionic/system_properties.c
__system_properties_init -> getenv("ANDROID_PROPERTY_WORKSPACE")
看到这里是不是真相大白了!
process初始化时会读取ANDROID_PROPERTY_WORKSPACE这个环境变量的内容来作为mmap的文件描述符。这样,property system的properties才对系统所有进程是共享的。呵呵,这个共享的文件描述符就存储在ANDROID_PROPERTY_WORKSPACE中。

这样,父进程在fork子进程后,拿到ANDROID_PROPERTY_WORKSPACE这个环境变量,然后在传递给exec就可以解决问题了。

好了,再试一把。
java -> get ANDROID_PROPERTY_WORKSPACE -> set ANDROID_PROPERTY_WORKSPACE to envp ->exec -> gethostbyname
果然ok了。
阅读(7529) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

godcoversme2013-09-13 12:00:37

新手也遇上这个问题~
弱弱的问下set ANDROID_PROPERTY_WORKSPACE to envp 怎么设置啊? 我的程序到这就退出了

figofuture2011-11-11 17:36:17

yqw1122: 你好,请问一下,怎么解决呢?
我现在也遇到了android域名解析不可的问题,底层也是c语言打包成so文件来调用的,调试到c语言的gethostbyname这个地方。不知道怎.....
我这篇文章不是在讲解决方案么?哥们你看文章啊!

yqw11222011-11-11 16:13:12

你好,请问一下,怎么解决呢?
我现在也遇到了android域名解析不可的问题,底层也是c语言打包成so文件来调用的,调试到c语言的gethostbyname这个地方。不知道怎么解决。能否共享一下方法?
谢谢。
E-mail:yqw1122@163.com

chinaunix网友2010-06-22 17:30:42

博主,真不错啊!俺现在也在做一个跟博主一样的项目,刚开始,请教一下啊!呵呵!我们原来的Windows应用程序是用c++写的,现在要移植到Android上,请问有没有相关的文档啊?比如,搭建Android+C的开发、编译环境,以及移植过程需要注意什么?主要是开发、编译环境!谢谢啊!可以给俺回信:hyc305@126.com !多谢多谢!