任务1.1:编译SensorGraph
金老师给我们本周的任务编译Android NDK示例中的SensorGraph。如果已经做过任务1的话,这个任务应该会很简单。
从Github上clone
源代码,将SensorGraph项目导入Android Studio,Gradle Sync & Build即可。
金老师给我们本周的任务编译Android NDK示例中的SensorGraph。如果已经做过任务1的话,这个任务应该会很简单。
从Github上clone
源代码,将SensorGraph项目导入Android Studio,Gradle Sync & Build即可。
金老师这周给我们布置的任务是:“交叉编译一个共享库(Shared Object),在安卓手机中加载它,显示一个Hello, world。”
要实现这一个目标有很多种途径,最简单的应该算是使用Android Studio中集成好的NDK。Android开发基本上离不开Android Studio。
NDK是额外组件,需要通过Android Studio中的SDK Manager进行安装。安装时还可以勾选构建工具CMake和调试用的LLDB。
安装完所有需要的组件后就万事俱备了。凭空将C++引入Android开发,最简单的方法就是从Native C++模板新建Android项目。
不过,从Native C++模板新建的项目有可能会默认选择其他NDK版本而拒绝使用当前的安装的NDK。这时,在模块的build.gradle
配置文件中将NDK的版本指定为当前安装的版本即可。
1 | apply plugin: 'com.android.application' |
模板已经将Gradle所需的全部依赖完整配置好了,并自动在MainActivity中引用了一个native String stringFromJNI()
方法。直接修改这个方法的实现就算是完成任务了。
这里也可以再多做一层封装:
在Project视图下的app/cpp
里新建先定义C++头文件hello.h
。
1 |
|
编写对应的C++实现文件hello.cpp
。
1 |
|
并将上述.cpp
文件加入CMakeLists.txt
的add_library
处理器中,跟模板生成的native-lib.cpp
放在一起。
1 | # CMakeLists.txt |
最后在native-lib.cpp
中调用新建的方法。
1 |
|
执行Gradle Build并连接手机或模拟器运行,即可在Logcat和MainActivity屏幕中看到预期的输出。
完整代码可见于Gitee。
金老师给我们的附加任务是从源代码编译一套GCC。
在GNU网站上有完整的关于如何从源代码编译GCC的指导。GNU网站上将编译和安装GCC的过程划分为6个步骤,我们只需要完成前4个步骤(即到Build这一步)就算是完成任务了。
我打算在云主机中编译GCC。总的来说,这不算是一件难事。
1 | # 在编译前确认系统信息。 |
这一部分对应指南中的第2步。
我跳过了指南中的第1步,因为第1步描述的是编译GCC所需要安装的软件。这些软件如果缺失的话,可以在“配置”这一步骤中检测出来。
GCC的源代码可以从GNU的官方Git仓库中克隆下来,或者从镜像网站下载。这里我选择的是速度较快的日本镜像站ftp.tsukuba.wide.ad.jp,下载的版本是9.2.0。
1 | cd ~ |
这样,GCC的源代码就准备好了。
这一部分对应指南中的第3步。
1 | $ pwd |
configure
在运行的过程中报错,看上去应该是必须的一些软件没有安装。依次执行yum search/info GMP
、yum search/info MPFR
和yum search MPC
、yum info libmpc
,发现应该是MPC包没有安装,sudo yum install libmpc
将需要的包装好,再次执行配置。
1 | $ ../gcc-9.2.0/configure |
由于不需要进行编译32位的程序,因此可以使用--disable-multilib
重新配置。
1 | $ ../gcc-9.2.0/configure |
到这里,这一步骤就顺利结束了。
这一部分对应指南中的第4步。
由于编译过程会持续很久,这时可以使用screen
这样的终端管理器。这样即使断开SSH连接,编译过程也继续运行。
1 | screen -S compile-gcc # 新建一个窗口提供给编译gcc使用。 |
中途可以重新连接上主机看一下编译过程是否出现差错。
1 | # 当重新通过SSH连接到主机时,使用screen恢复之前的会话。 |
在我的主机上,编译过程持续了7个小时。
编译完成后就可以准备安装了。本来还应该进行测试步骤,但因为测试耗费时间太长,跳过这一步吧。
为避免覆盖系统的GCC,make install
时指定一个目录进行安装。
1 | $ screen -r compile-gcc |
make install
结束后用热乎着的编译器编译一个新的Hello, world看看。
1 | $ cd ../gcc-9.2.0-target && pwd |
好,大功告成。
编译产生的中间产物很多,安装完成后就不需要这些文件了。若是磁盘空间紧俏,可以直接删除。
1 | $ du ~/esit-workspace/task0.1/* -sh |