Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android本机代码中获取mac地址_Android_Android Ndk - Fatal编程技术网

如何在Android本机代码中获取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

我可以用这个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_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获取它并传递它。参见(第五答案向下的工作)