BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #43894同步于 2015/8/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

非启动页面WiFi链接的编译,求助!!!

sUNeNjoy
2015/8/30镜像同步1 回复
Android底层的一段改写源码,需要编译,NDK下提示头文件找不到,我就把源码中的头文件一起放进来,但是发现该段代码用到的都是Android源码中的函数,所以无法通过NDK编译使用,但Android源码下的编译我不会啊,所以希望大神们提供一下思路或者流程,如果能帮小弟尝试编译一下,那就十分感谢了,源码如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include "string.h" #include "hardware_legacy/wifi.h" #include "cutils/log.h" #include "cutils/properties.h" #include <arpa/inet.h> #include <netutils/ifc.h> #include <netutils/dhcp.h> static int doCommand(const char *cmd, char *replybuf, int replybuflen) { size_t reply_len = replybuflen - 1; if (wifi_command(cmd, replybuf, &reply_len) != 0) return -1; else { // Strip off trailing newline if (reply_len > 0 && replybuf[reply_len-1] == '\n') replybuf[reply_len-1] = '\0'; else replybuf[reply_len] = '\0'; return 0; } } static int doIntCommand(const char *cmd) { char reply[256]; if (doCommand(cmd, reply, sizeof(reply)) != 0) { return -1; } else { return atoi(reply); } } static int doBooleanCommand(const char *cmd, const char *expect) { char reply[256]; if (doCommand(cmd, reply, sizeof(reply)) != 0) { return 0; } else { return (strcmp(reply, expect) == 0); } } // Send a command to the supplicant, and return the reply as a String static char* doStringCommand(const char *cmd) { char reply[4096]; if (doCommand(cmd, reply, sizeof(reply)) != 0) { return NULL; } else { return reply; } } int init_stage() { // load the wifi driver: insmod .ko int ret = wifi_load_driver(); if(ret < 0) { LOGE("Failed to load Wi-Fi driver. %s",strerror(errno)); return -1; } // start wpa_supplicant ret = wifi_start_supplicant(); if(ret < 0) { LOGE("Failed to start supplicant daemon. %s",strerror(errno)); return -1; } ret = wifi_connect_to_supplicant(); if(ret < 0) { LOGE("Failed to connect supplicant daemon. %s",strerror(errno)); return -1; } char ifname[256]; property_get("wifi.interface", ifname ,"eth0"); ret = ifc_enable(ifname); if(ret < 0) { LOGE("Failed to enable wifi interface %s. %s", ifname ,strerror(errno)); return -1; } return 0; } int scan_stage(){ // XXX we don't need to really scan the wifi return 0; } #define SSID_NAME "ssid" #define KEY_MGMT "key_mgmt" #define SSID "\"xxxxx\"" #define PASS "NONE" int config_stage(){ // Add a network config to supplicant mode int networkId = doIntCommand("ADD_NETWORK"); // Add a new network id if(networkId < 0) { LOGE("Failed to add a network configuration. %s",strerror(errno)); return -1; } LOGE("Add a network %d",networkId); // set the ssid of the destination wifi adhoc char cmdstr[256]; snprintf(cmdstr, sizeof(cmdstr), "SET_NETWORK %d %s %s",networkId, SSID_NAME, SSID); if(!doBooleanCommand(cmdstr,"OK")) { LOGE("Failed to set network %d configuration ssid. %s", networkId, strerror(errno)); return -1; } snprintf(cmdstr, sizeof(cmdstr), "SET_NETWORK %d %s %s", networkId, KEY_MGMT ,PASS); if(!doBooleanCommand(cmdstr,"OK")) { LOGE("Failed to set network %d configuration key_mgmr. %s", networkId, strerror(errno)); return -1; } return networkId; } #define CONNECTED "CONNECTED" int connect_stage(int networkId) { char cmdstr[256]; // enable the network snprintf(cmdstr, sizeof(cmdstr), "SELECT_NETWORK %d",networkId); if(!doBooleanCommand(cmdstr,"OK")) { LOGE("Failed to select network %d. %s", networkId, strerror(errno)); return -1; } // wait for connect char buf[256]; while(1) { int nread = wifi_wait_for_event(buf, sizeof(buf)); if(nread > 0) { LOGE("receive buf:\n %s\n",buf); if(strstr(buf,CONNECTED) > 0) { break; } // XXX danger of not going out of the loop!!! } continue; } return 0; } int dhcp_stage(){ int result; in_addr_t ipaddr, gateway, mask, dns1, dns2, server; uint32_t lease; char ifname[256]; char mDns1Name[256]; char mDns2Name[256]; property_get("wifi.interface", ifname ,"eth0"); snprintf(mDns1Name, sizeof(mDns1Name), "net.%s.dns1",ifname); snprintf(mDns2Name, sizeof(mDns2Name), "net.%s.dns2",ifname); result = dhcp_do_request(ifname, &ipaddr, &gateway, &mask, &dns1, &dns2, &server, &lease); if(result != 0) { LOGE("Failed to dhcp on interface %s. %s", ifname, strerror(errno)); return -1; } struct in_addr dns_struct1, dns_struct2; dns_struct1.s_addr = dns1; dns_struct2.s_addr = dns2; property_set(mDns1Name,inet_ntoa(dns_struct1)); property_set(mDns2Name,inet_ntoa(dns_struct2)); return 0; } int main(int argc, char *argv[]) { int ret = init_stage(); if(ret < 0) { LOGE("Failed init stage. %s",strerror(errno)); exit(-1); } LOGE("Finished init stage."); ret = config_stage(); if(ret < 0) { LOGE("Failed config stage. %s",strerror(errno)); exit(-1); } LOGE("Finished config stage."); ret = connect_stage(ret); if(ret < 0) { LOGE("Failed connect stage. %s",strerror(errno)); exit(-1); } LOGV("Finished connect stage."); ret = dhcp_stage(); if(ret < 0) { LOGE("Failed dhcp stage. %s",strerror(errno)); exit(-1); } LOGE("Finished dhcp stage."); return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
lixing机器人#1 · 2015/8/30
最近刚编译了android的源码,我的博客 http://iluhcm.github.io/ 另外,最值得参考的便是老罗的android源代码分析 http://blog.csdn.net/luoshengyang/article/details/6566662 会教你怎么单独编译一个模块。