本文在前一篇基础上,详细介绍以CrossApp跨平台框架为基础,利用mosquito库和easySQLite库设计实现了基于MQTT协议的android版步进电机控制客户端。
一、开发环境的准备
编译环境为CrossApp平台提供的一键部署windows下android开发环境的工具包:
下载地址:
http://pan.baidu.com/s/1qW6ql32#dir/path=%2FCrossApp-Ide
工具包的安装在此省略。参考文章:
https://www.oschina.net/question/1271569_160671
一步步按照向导设置好自己的软件环境。我安装的是x64版。
二、工程的构建和基本设置
安装好后,运行C:\CrossApp\eclipse下的eclipse.exe
参考:http://blog.csdn.net/j2066/article/details/47624109
菜单->file->new->other
然后next,选对相应的android工程:
导入成功后看到:
看到前面左下角有个红色的叉,这是因为框架代码没有导入进来。
接着,按照前面的方法导入CrossApp框架代码工程:
然后看到有错误提示:
[2017-10-02 20:09:21 - StepMotorController] Unable to resolve target 'android-20'
[2017-10-02 20:14:47 - libCrossApp] Unable to resolve target 'android-20'
[2017-10-02 20:14:49 - libCrossApp] Unable to resolve target 'android-20'
需要修改libCrossApp的属性。
对着libCrossApp点右键,选Properties(属性):
在Project Build Target中选Android 4.4.2:
对于StepMotorController项目也一样设置这个地方:
接着,我们需要修改一下StepMotorController项目下的make文件:
双击项目下的jni下的Android.mk文件:
需要修改这个地方:
为去掉注释符号:
$(call import-add-path, $(LOCAL_PATH)/../../../..)
$(call import-add-path, $(LOCAL_PATH)/../../../../CrossApp/the_third_party/)
先编译一下,右击项目,Run As->Android Application:
看到命令行有个错误:
这个错误是本项目的NDK构建环境android-ndk-r9路径设置有问题造成的:
右键点StepMotorController属性(Properties)->c/c++ Build->Environment->NDK ROOT:
双击这一行,把NDK ROOT设置为自己的路径,我们装包默认的是C:\CrossApp\android-ndk-r9d:
点OK:
还有一个地方需要修改:
修改为我们安装的目录:
C:\CrossApp\android-ndk-r9d\ndk-build.cmd
点OK,编译一下,看到一条错误:
jni/../../Classes/easySQLite/SqlCommon.h:136:22: error: format not a string literal and no format arguments [-Werror=format-security]
参考网上文章,原因是:
android-ndk-r9与Eclipse的版本不兼容问题
解决方法:
在对应项目的proj.android/jni/Application.mk添加一句话
APP_CFLAGS += -Wno-error=format-security
意思就是无视这个error
再次编译,又出来错误:
jni/../../Classes/MenuViewController.cpp:105:15: error: converting to execution character set: Illegal byte sequence
这个错误原因是MenuViewController.cpp这个文件的文本格式是ANSI,因为不是支持unicode的格式,所以,不支持中文编码。
解决这个问题的方法是,用记事本打开这个文件另存为UTF-8格式:
编译一下,又出现错误:
jni/../../Classes/easySQLite/SqlCommon.cpp: In member function 'sql::string sql::time::format(const char*)':
jni/../../Classes/easySQLite/SqlCommon.cpp:70:38: error: 'localtime_s' was not declared in this scope
if (localtime_s(&localtime, &_value) == 0)
^
jni/../../Classes/easySQLite/SqlCommon.cpp: In function 'sql::string sql::intToStr(int)':
jni/../../Classes/easySQLite/SqlCommon.cpp:116:43: error: '_itoa_s' was not declared in this scope
_itoa_s(value, buffer, sizeof(buffer), 10);
^
jni/../../Classes/easySQLite/SqlCommon.cpp: In function 'sql::string sql::intToStr(sql::integer)':
jni/../../Classes/easySQLite/SqlCommon.cpp:123:45: error: '_i64toa_s' was not declared in this scope
_i64toa_s(value, buffer, sizeof(buffer), 10);
^
make.exe: *** [obj/local/armeabi/objs/CrossApp_cpp_shared/__/__/Classes/easySQLite/SqlCommon.o] Error 1</