下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >移动开发 >移动开发多平台代码共享

移动开发多平台代码共享

虎牙小月半发布于 2015-06-30 10:43查看:479回复:4

做移动开发快一年了,有幸接触了WM、Symbian、Android、iPhone等多个平台的开发。往往一个软件需要实现多个平台的版本,对于不同平台进行重新编码是一件很费劲的事情,其实我们可以通过代码共用技术,实现对一些代码的重用。

  这一技术的应用,可用带来不少的好处:

  1. 代码重用:节约开发和维护的时间

  2. 核心代码的保护:将核心代码编译成库,只将库而不是源代码提供给上层开发人员使用。

  3. 。。。。。。

  本文将实现一个支持这几个平台的天气信息查询软件,软件采用C语言去实现调用WebService接口获取天气信息的功能,并将其编译成各种平台能够调用的库,而UI则采用各个平台各自的语言去实现,最终实现底层代码的共用。

先来看看最终的效果图:

1435632171821351.jpg

一、底层代码的实现

  我们要调用到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;
}

  二、Windows Mobile 平台

  对于WM平台,为了与底层库相区别,我们就不用VC去实现UI,而使用C#来实现UI。

  1. 编译dll

  Visual C++  – 智能设备 – 由于没有好的dll模板,我们就建一个“MFC智能设备DLL”,

1435632208194861.jpg

取名ShareLib,然后在生成的项目中删除掉没用的文件(比如预编译啥的),添加我们的底层代码文件

收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

共有4条评论

  • 慧星的那一夜
  • MK
  • 药师
  • IT宅男
  • mr jack
  • YUI
  • Mr ken
  • cappuccino
  • 课课家技术团队1
  • 选择版块:

  • 标题:

  • 内容

  • 验证码:

  • 标题:

  • 内容

  • 选择版块:

移动帖子x

移动到: