前言
本文目的在于记录SOME/IP协议的实现库-- vsomeip协议栈在android平台中的编译,内容包含如下:
环境配置
环境:
操作系统:Window10
IDE:AndroidStudio
gradle版本:6.7.1
cmake版本:3.17.2
这里简单说一下,在实际操作过程中有尝试过使用更高版本的cmake与gradle工具来编译,但是产生的问题是使用高版本的gradle编译后libvsomeip3.so库无法生成,但是无编译报错。使用高版本的cmake会导致编译报错。因为时间问题暂且放后续跟进,有知道的兄弟可以说下。
编译依赖
vsomeip中的网络通讯以及部分dlt日志实现依赖c++ boost库,因此需要这两部分的源码
https://github.com/GENIVI/vsomeip
- 下载boost库,版本必须大于1.55,依赖其中的三个模块(system, thread and log)
https://master.dl.sourceforge.net/project/boost/boost/1.71.0.beta1/boost_1_71_0_b1.tar.bz2?viasf=1或者去https://www.boost.org/users/download/下载指定的版本
https://github.com/Orphis/boost-cmake
工程配置
新建工程,类型选择native应用,工程目录如下:
修改编译环境
//工程的build.gradle文件指定gradle工具为4.0.1
buildscript {
ext.kotlin_version = "1.5.31"
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
...
...
}
}
修改gradle/wrapper/gradle-wrapper.properties, 指定gradle版本为6.7.1,此处如有同步失败,需要gradle-wrapper.jar同步更新为低版本的jar包。
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
修改local.properties
sdk.dir=C\:\\Users\\zoujie\\AppData\\Local\\Android\\Sdk
cmake.dir=C\:\\Users\\zoujie\\AppData\\Local\\Android\\Sdk\\cmake\\3.17.2
修改app模块的build.gradle, 在android{} 目录下添加如下:
android{
defaultConfig{
...
...
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "arm64-v8a"
arguments "-DANDROID_STL=c++_shared", "-DLOGGER_BUILD_HEADER_LIB=OFF", "-DUSE_INSTALLED_COMMONAPI=OFF"
}
}
}
externalNativeBuild {
cmake {
path "../CMakeLists.txt"
version "3.17.2"
}
}
}
添加模块编译
external 是新建的文件夹,我们需要将编译依赖模块中提到的boost-cmake, boost, vsomeip的三个工程下载下来复制到该目录下。
- boost-cmake主要是用来构建boost模块的配置文件,默认是从网络上fetch boost源码,我们已经手动下载了就不需要去重复同步,只需修改boost-cmake/CMakeLists.txt文件,修改内容如下:
set(FETCHCONTENT_SOURCE_DIR_BOOST ${CMAKE_CURRENT_SOURCE_DIR}/../boost_1_72_0)
include(FetchContent)
FetchContent_GetProperties(Boost)
- cmake_module 是存放查找库的配置文件信息的,新建FindBoost.cmake, Findvsomeip3.cmake两个文件,内容如下:
FindBoost.cmake文件内容
set(Boost_FOUND TRUE)
set(Boost_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../boost_1_72_0)
file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" boost_version_raw
REGEX "define BOOST_VERSION "
)
string(REGEX MATCH "[0-9]+" boost_version_raw "${boost_version_raw}")
set(Boost_VERSION ${boost_version_raw})
foreach(comp ${Boost_FIND_COMPONENTS})
list(APPEND Boost_LIBRARIES Boost::${comp})
endforeach()
Findvsomeip3.cmake
set(vsomeip3_FOUND TRUE)
set(vsomeip3_VERSION "030120")
set(VSOMEIP3_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/external/vsomeip-3.1.20.3/interface)
list(APPEND VSOMEIP_LIBRARIES vsomeip3)
- 根目录的CMakeLists.txt文件是整个工程C/C++库的编译配置入口,内容如下:
cmake_minimum_required(VERSION 3.4.1)
project(SomeIP)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output/${CMAKE_ANDROID_ARCH_ABI}/)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake_module)
add_subdirectory(external/boost-cmake)
add_subdirectory(external/vsomeip-3.1.20.3)
add_subdirectory(app/src/main/cpp)
配置完成启动编译,编译完成后即可在工程目录中看到相关的库:
当然这里也可以使用ubuntu虚拟机去编译vsomeip与boost,然后拷贝so库跟头文件到项目中,引用so库的方式可以参考我之前写的文章,不过这种方式太麻烦,我还是采用AndroidStudio构建了,下一篇文章来看看vsomeip中的常用API以及用法,配置。
|