如何在Android本机代码中获取mac地址
我可以用这个C代码获得mac地址:如何在Android本机代码中获取mac地址,android,android-ndk,Android,Android Ndk,我可以用这个C代码获得mac地址: struct ifreq s; char buffer[12 + 1]; int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); int i, j; memset(buffer, 0 , sizeof(buffer)); strcpy(s.ifr_name, "wlan0"); if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { memcpy(mac, s.ifr_ad
struct ifreq s;
char buffer[12 + 1];
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
int i, j;
memset(buffer, 0 , sizeof(buffer));
strcpy(s.ifr_name, "wlan0");
if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
memcpy(mac, s.ifr_addr.sa_data, 6);
return 1;
}
我想在安卓系统中获取mac地址。但这段代码没有给出MAC地址<代码>如果(0==ioctl(fd,SIOCGIFHWADDR,&s)始终为false
我发现了一个密码
但该代码给出了错误:
ioctl(SIOCGIFHWADDR) error
它给出了错误的mac地址,比如00:00:00:7C::00:01
如何在Android本机代码中获取mac地址?您必须连接到WiFi网络,然后尝试获取mac地址。此代码在Nexus 5上运行良好:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <linux/sockios.h>
#include <linux/if.h>
#include <linux/in.h>
int get_mac_addr(char *mac_addr)
{
int sockfd;
struct ifreq ifr;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) >= 0) {
//strncpy(ifr.ifr_name, "eth0", IFNAMESIZE);
strncpy(ifr.ifr_name, "wlan0", IFNAMSIZ);
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl(sockfd, SIOCGIFHWADDR, (char*) &ifr) == 0) {
sprintf(mac_addr, "%02X:%02X:%02X:%02X:%02X:%02X",
(unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[0], (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[1],
(unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[2], (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[3],
(unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[4], (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[5]);
return 0;
}
}
/* error */
return -1;
}
int main(int argc, char *argv[], char *envp[])
{
char mac_addr[80] = {0};
printf( "MAC = %d, %s\n", get_mac_addr(mac_addr), mac_addr );
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int get_mac_addr(char*mac_addr)
{
int-sockfd;
结构ifreq-ifr;
如果((sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_IP))>=0){
//strncpy(ifr.ifr_名称,“eth0”,IFNAMESIZE);
strncpy(ifr.ifr_名称,“wlan0”,IFNAMSIZ);
ifr.ifr\u addr.sa\u family=AF\u INET;
if(ioctl(sockfd,SIOCGIFHWADDR,(char*)&ifr)==0){
sprintf(mac_addr,“%02X:%02X:%02X:%02X:%02X:%02X:%02X”,
(无符号字符)ifr.ifr\u ifru.ifru\u hwaddr.sa\u数据[0],(无符号字符)ifr.ifr\u ifru.ifru\u hwaddr.sa\u数据[1],
(无符号字符)ifr.ifr\u ifru.ifru\u hwaddr.sa\u数据[2],(无符号字符)ifr.ifr\u ifru.ifru\u hwaddr.sa\u数据[3],
(无符号字符)ifr.ifr_ifru.ifru_hwaddr.sa_数据[4],(无符号字符)ifr.ifr_ifru.ifru_hwaddr.sa_数据[5];
返回0;
}
}
/*错误*/
返回-1;
}
int main(int argc,char*argv[],char*envp[]
{
char mac_addr[80]={0};
printf(“MAC=%d,%s\n”,get\u MAC\u addr(MAC\u addr),MAC\u addr);
返回0;
}
FYY,它以前在Android ME之前工作,考虑用java获取它并传递它。参见(第五答案向下的工作)