编译linux程序在android系统上自启动!!!

     本文由于android系统APP设置ethernet ip 无权限,设置不能成功,后采用比较笨方法:linux程序中读出3个文件ipaddr,netmask,gateway值然后进行设置,android通过写ip,netmask,gateway,分别到ipaddr,netmask,gateway,三个文件中。

1、linux程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <error.h>
#include <net/route.h>


int SetIfAddr(char *ifname, char *Ipaddr, char *mask,char *gateway)

{

    int fd;
    int rc;

    struct ifreq ifr; 
    struct sockaddr_in *sin;
    struct rtentry  rt;

 
    fd = socket(AF_INET, SOCK_DGRAM, 0);

    if(fd < 0)
    {
            perror("socket   error");     
            return -1;     
    }

    memset(&ifr,0,sizeof(ifr)); 
    strcpy(ifr.ifr_name,ifname); 
    sin = (struct sockaddr_in*)&ifr.ifr_addr;     
    sin->sin_family = AF_INET;     

    //IP地址

    if(inet_aton(Ipaddr,&(sin->sin_addr)) < 0)   
    {     

        perror("inet_aton   error");         
        close(fd);   
        return -2;     
    }    

 
    if(ioctl(fd,SIOCSIFADDR,&ifr) < 0)   
    {     
        perror("ioctl   SIOCSIFADDR   error");         
        close(fd);    
        return -3;     
    }

    //子网掩码

    if(inet_aton(mask,&(sin->sin_addr)) < 0)   
    {     

        perror("inet_pton   error");             
        close(fd);
        return -4;     
    }    

    if(ioctl(fd, SIOCSIFNETMASK, &ifr) < 0)
    {
        perror("ioctl");
        close(fd);
        return -5;

    }

    //网关

    memset(&rt, 0, sizeof(struct rtentry));
    memset(sin, 0, sizeof(struct sockaddr_in));
    sin->sin_family = AF_INET;
    sin->sin_port = 0;
    if(inet_aton(gateway, &sin->sin_addr)<0)

    {

       printf ( "inet_aton error\n" );

    }

    memcpy ( &rt.rt_gateway, sin, sizeof(struct sockaddr_in));
    ((struct sockaddr_in *)&rt.rt_dst)->sin_family=AF_INET;
    ((struct sockaddr_in *)&rt.rt_genmask)->sin_family=AF_INET;
    rt.rt_flags = RTF_GATEWAY;
    if (ioctl(fd, SIOCADDRT, &rt)<0)

    {

        perror( "ioctl(SIOCADDRT) error in set_default_route\n");
        close(fd);
        return -1;

    }

    close(fd);
    return rc;

}
 
int main(void)
{
	char ipaddr[30] = {0};
	char gateway[30] = {0};
	char netmask[30] = {0};
	int fd_ip = 0;
	int fd_mask = 0;
	int fd_gateway =0;
	
	
	//sleep(20);

 	// read ipaddr
 	fd_ip = open("/data/ipaddr",O_RDONLY,NULL);
 	
	if(fd_ip == 0)
	{
		perror("open ipaddr");
		return -1;
	}
	
	
	if(read(fd_ip,ipaddr,30) == 0)
	{
		perror("read ipaddr");
		close(fd_ip);
		return -1;
	}
	close(fd_ip);
	
	
	// read netmask 
 	fd_mask = open("/data/netmask",O_RDONLY,NULL);
 	
	if(fd_mask == 0)
	{
		perror("open netmask");
		return -1;
	}
	
	
	if(read(fd_mask,netmask,30) == 0)
	{
		perror("read netmask");
		close(fd_mask);
		return -1;
	}
	close(fd_mask);	
	
	// read gateway 
 	fd_gateway = open("/data/gateway",O_RDONLY,NULL);
 	
	if(fd_gateway == 0)
	{
		perror("open gateway");
		return -1;
	}
	
	
	if(read(fd_gateway,gateway,30) == 0)
	{
		perror("read gateway");
		close(fd_gateway);
		return -1;
	}
	close(fd_gateway);	
	
	printf("setip:%s\n",ipaddr);
	printf("set netmask:%s\n",netmask);
	printf("set gateway:%s\n",gateway);

	SetIfAddr("eth0",ipaddr,netmask,gateway);
	
	return 0;
}

2、虚假机上交叉编译问题

     arm-linux-gcc -o ipset -static setip.c

特别注意: -static 必须加上,如果不加默认编译中会添加动态库,编译后的执行文件,push到android板上后执行不能识别

3、程序push进目标板后,需要设置自启动,找到android源码init.rc文件,文件末尾添加

service ifset /data/ipset
    class main
    group root
    user root
    oneshot

编译系统,升级boot.img,这时候android系统重启后,根目录中init.rc中已添加更改代码。

4、通过adb shell 命令 netcfg查看是否设置ip成功

5、连接设备ping是否能ping通

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值