|
做移动开发快一年了,有幸接触了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();
#else
shutdown(sockfd, SHUT_RDWR);
#endif
return content;
}
it知识库:移动开发多平台代码共享,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。