返回信息流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;
}
这是一条镜像帖。来源:北邮人论坛 / java / #43894同步于 2015/8/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
非启动页面WiFi链接的编译,求助!!!
sUNeNjoy
2015/8/30镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
最近刚编译了android的源码,我的博客 http://iluhcm.github.io/
另外,最值得参考的便是老罗的android源代码分析 http://blog.csdn.net/luoshengyang/article/details/6566662
会教你怎么单独编译一个模块。