从类型 'int' 分配给类型 'struct in_addr' 时类型不兼容
incompatible types when assigning to type 'struct in_addr' from type 'int'
我在linux(ubuntu 12.04 linux kernel 3.12.17)中写了下面的代码,比较成功,但是当我用eclipse移动android中的代码时, 并与 ndk 进行比较,它显示错误:从类型 'int'.
分配给类型 'struct in_addr' 时类型不兼容
addrs = inet_makeaddr(inet_netof(sin->sin_addr), INADDR_ANY);
整个代码是:
#include <jni.h>
#include <linux/if.h>
#include <linux/in.h>
#include <linux/sockios.h>
#include <stdint.h>
#include <sys/endian.h>
static struct in_addr *getbroadcastaddr(char *inter, int sock, char *buf){
struct ifconf ifc;
struct ifreq ifreq,*ifr;
static struct in_addr addrs;
struct sockaddr_in *sin;
bzero(&addrs,sizeof(addrs));
ifc.ifc_len = UDPMSGSIZE;
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
perror("broadcast: ioctl (get interface configuration)");
return(&addrs);
}
ifr = ifc.ifc_req;
for (ifr=ifc.ifc_req;ifr->ifr_name[0];ifr++) {
if (strcmp(ifr->ifr_name,inter)) continue;
ifreq = *ifr;
if (ioctl(sock, SIOCGIFFLAGS, (char *)&ifreq) < 0) {
perror("broadcast: ioctl (get interface flags)");
continue;
}
if ((ifreq.ifr_flags & IFF_BROADCAST) &&
(ifreq.ifr_flags & IFF_UP) &&
(ifr->ifr_addr.sa_family == AF_INET)) {
sin = (struct sockaddr_in *)&ifr->ifr_addr;
if (ioctl(sock, SIOCGIFBRDADDR, (char *)&ifreq) < 0) {
addrs = inet_makeaddr(inet_netof(sin->sin_addr), INADDR_ANY);
} else {
addrs = ((struct sockaddr_in *)
(&ifreq.ifr_broadaddr))->sin_addr;
}
printf("Interface : %s\n",ifr->ifr_name);
return(&addrs);
}
}
return(NULL);
}
为什么? android-ndk 中的函数 'inet_makeaddr' 在枪中是否不同?
错误消息具有误导性,早期版本的 NDK 中根本缺少该功能。编译器会产生不兼容的类型错误,因为当函数未定义时,它假定 return 类型为 int
.
相关文件为(NDK文件夹)/platforms/android-xx/arch-yyy/usr/include/arpa/inet.h
您可以通过更新到 the latest version of the NDK 来解决您的问题。从 android-21
开始,inet_makeaddr
在 inet.h
中定义
如果之后仍然出现编译错误,请尝试
#include <arpa/inet.h>
我在linux(ubuntu 12.04 linux kernel 3.12.17)中写了下面的代码,比较成功,但是当我用eclipse移动android中的代码时, 并与 ndk 进行比较,它显示错误:从类型 'int'.
分配给类型 'struct in_addr' 时类型不兼容addrs = inet_makeaddr(inet_netof(sin->sin_addr), INADDR_ANY);
整个代码是:
#include <jni.h>
#include <linux/if.h>
#include <linux/in.h>
#include <linux/sockios.h>
#include <stdint.h>
#include <sys/endian.h>
static struct in_addr *getbroadcastaddr(char *inter, int sock, char *buf){
struct ifconf ifc;
struct ifreq ifreq,*ifr;
static struct in_addr addrs;
struct sockaddr_in *sin;
bzero(&addrs,sizeof(addrs));
ifc.ifc_len = UDPMSGSIZE;
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
perror("broadcast: ioctl (get interface configuration)");
return(&addrs);
}
ifr = ifc.ifc_req;
for (ifr=ifc.ifc_req;ifr->ifr_name[0];ifr++) {
if (strcmp(ifr->ifr_name,inter)) continue;
ifreq = *ifr;
if (ioctl(sock, SIOCGIFFLAGS, (char *)&ifreq) < 0) {
perror("broadcast: ioctl (get interface flags)");
continue;
}
if ((ifreq.ifr_flags & IFF_BROADCAST) &&
(ifreq.ifr_flags & IFF_UP) &&
(ifr->ifr_addr.sa_family == AF_INET)) {
sin = (struct sockaddr_in *)&ifr->ifr_addr;
if (ioctl(sock, SIOCGIFBRDADDR, (char *)&ifreq) < 0) {
addrs = inet_makeaddr(inet_netof(sin->sin_addr), INADDR_ANY);
} else {
addrs = ((struct sockaddr_in *)
(&ifreq.ifr_broadaddr))->sin_addr;
}
printf("Interface : %s\n",ifr->ifr_name);
return(&addrs);
}
}
return(NULL);
}
为什么? android-ndk 中的函数 'inet_makeaddr' 在枪中是否不同?
错误消息具有误导性,早期版本的 NDK 中根本缺少该功能。编译器会产生不兼容的类型错误,因为当函数未定义时,它假定 return 类型为 int
.
相关文件为(NDK文件夹)/platforms/android-xx/arch-yyy/usr/include/arpa/inet.h
您可以通过更新到 the latest version of the NDK 来解决您的问题。从 android-21
inet_makeaddr
在 inet.h
中定义
如果之后仍然出现编译错误,请尝试
#include <arpa/inet.h>