|
做移動開發(fā)快一年了,有幸接觸了WM、Symbian、Android、iPhone等多個平臺的開發(fā)。往往一個軟件需要實(shí)現(xiàn)多個平臺的版本,對于不同平臺進(jìn)行重新編碼是一件很費(fèi)勁的事情,其實(shí)我們可以通過代碼共用技術(shù),實(shí)現(xiàn)對一些代碼的重用。
這一技術(shù)的應(yīng)用,可用帶來不少的好處:
1. 代碼重用:節(jié)約開發(fā)和維護(hù)的時間
2. 核心代碼的保護(hù):將核心代碼編譯成庫,只將庫而不是源代碼提供給上層開發(fā)人員使用。
3. 。。。。。。
本文將實(shí)現(xiàn)一個支持這幾個平臺的天氣信息查詢軟件,軟件采用C語言去實(shí)現(xiàn)調(diào)用WebService接口獲取天氣信息的功能,并將其編譯成各種平臺能夠調(diào)用的庫,而UI則采用各個平臺各自的語言去實(shí)現(xiàn),最終實(shí)現(xiàn)底層代碼的共用。
先來看看最終的效果圖:
一、底層代碼的實(shí)現(xiàn)
我們要調(diào)用到WebService接口,需要使用網(wǎng)絡(luò)
而對于不同的平臺socket的使用上有細(xì)微差異,我通過條件編譯的方式,實(shí)現(xiàn)對不同平臺的兼容。
下面是實(shí)現(xiàn)代碼:
//對于VC的DLL,需要導(dǎo)出函數(shù),而其他的則不需要
頭文件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>
//根據(jù)系統(tǒng)加載不同的網(wǎng)絡(luò)庫
#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);
//}
//不同平臺關(guān)閉socket的方法不同
#ifdef _MSC_VER
closesocket(sockfd);
WSACleanup();
#else
shutdown(sockfd, SHUT_RDWR);
#endif
return content;
}
it知識庫:移動開發(fā)多平臺代碼共享,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。