首页>
知识库>
详情

移动开发多平台代码共享

2020-07-29 来源:CloudBest 阅读量: 0
关键词:

    做移动开发快一年了,有幸接触了WM、Symbian、Android、iPhone等多个平台的开发。往往一个软件需要实现多个平台的版本,对于不同平台进行重新编码是一件很费劲的事情,其实我们可以通过代码共用技术,实现对一些代码的重用。
    这一技术的应用,可用带来不少的好处:
    1. 代码重用:节约开发和维护的时间
    2. 核心代码的保护:将核心代码编译成库,只将库而不是源代码提供给上层开发人员使用。
    3. ……
    本文将实现一个支持这几个平台的天气信息查询软件,软件采用C语言去实现调用WebService接口获取天气信息的功能,并将其编译成各种平台能够调用的库,而UI则采用各个平台各自的语言去实现,最终实现底层代码的共用。

    一、底层代码的实现
    我们要调用到WebService接口,需要使用网络
    而对于不同的平台socket的使用上有细微差异,我通过条件编译的方式,实现对不同平台的兼容。
    下面是实现代码:
    //对于VC的DLL,需要导出函数,而其他的则不需要
    头文件Common.h
    #ifdef _MSC_VER
    #define DLLFLAG _declspec(dllexport)
    #else
    #define DLLFLAG ""
    #endif
    //通过WebService接口获取天气信息
    DLLFLAG char* getWeather(const char *cityName);
    源文件Common.c
    #include  <string.h>
    #include  <Common.h>
    #include  <stdlib.h>
    //根据系统加载不同的网络库
    #ifdef _MSC_VER
    #include  <winsock2.h>
    #pragma comment(lib, "winsock.lib")
    #else
    #include  <sys/socket.h>
    #include  <netinet/in.h>
    #include  <arpa/inet.h>
    #include  <netdb.h>
    #endif
    #define BUFSIZ 4096
    DLLFLAG char* getWeather(const char *pCityName)
    {
    //对于VC需要初始化socket版本
    #ifdef _MSC_VER
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    #endif
    int sockfd = 0;
    struct sockaddr_in addr;
    char text[BUFSIZ] = "";
    char header[BUFSIZ] = "";
    char *content = (char*)malloc(BUFSIZ);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    //不同平台填充地址字段的方式不同
    #ifdef _MSC_VER
    addr.sin_addr.S_un.S_addr =inet_addr("222.73.218.218");
    #else
    inet_aton("222.73.218.218",&addr.sin_addr);
    #endif
    addr.sin_port = htons(80);
    memset(header, 0, sizeof(header));
    strcat(header, "GET /Service.asmx/getWeatherbyCityName?theCityName=");
    strcat(header, pCityName);
    strcat(header, "&theDayFlag=Today HTTP/1.1rn");
    strcat(header, "Host: www.ayandy.comrnrn");
    connect(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
    send(sockfd, header, strlen(header), 0);
    memset(text, 0, BUFSIZ);
    memset(content, 0, BUFSIZ);
    recv(sockfd, text, BUFSIZ, 0);
    strcat(content, text);
    //while ( recv(sockfd, text, BUFSIZ, 0) > 0)
    //{
    //  strcat(content, text);
    //  memset(text, 0, BUFSIZ);
    //}
    //不同平台关闭socket的方法不同
    #ifdef _MSC_VER
    closesocket(sockfd);
    WSACleanup();