Android cmake多渠道打包配置

2019-12-10  本文已影响0人  省油的灯_wsy

最近有个项目需求,根据不同的渠道要修改不同的C++代码,发现虽然java代码可以使用指定渠道的源码编译,但是C++代码却不做不到,最后找到了个解决方案,写个文章记录一下。

一、工程配置

1. build.gradle中的配置

    // 创建一个维度,名称为shape
    flavorDimensions "shape"
    productFlavors{
        circle{
            dimension "shape"
            externalNativeBuild{
                cmake{
                    // 附加额外参数,参数名:SHAPE,参数值为渠道名
                    arguments "-DSHAPE=circle"
                }
            }
        }
        rect{
            dimension "shape"
            externalNativeBuild{
                cmake{
                    // 附加额外参数,参数名:SHAPE,参数值为渠道名
                    arguments "-DSHAPE=rect"
                }
            }
        }
    }

2. 项目目录结构

这里贴出的是src目录下的文件内容,每个渠道下包含相关的Java类和头文件

└─src
    ├─circle
    │  ├─cpp
    │  │      config.h
    │  │
    │  └─java
    │      └─com
    │          └─wsy
    │              └─cmakemultichannelpackage
    │                      Shape.java
    │
    ├─main
    │  │  AndroidManifest.xml
    │  │
    │  ├─cpp
    │  │      native-lib.cpp
    │  │
    │  ├─java
    │  │  └─com
    │  │      └─wsy
    │  │          └─cmakemultichannelpackage
    │  │                  MainActivity.java
    │  │
    │  └─res(资源文件就不贴出来了)
    ├─rect
    │  ├─cpp
    │  │      config.h
    │  │
    │  └─java
    │      └─com
    │          └─wsy
    │              └─cmakemultichannelpackage
    │                      Shape.java

3. CMakeLists中获取传入的参数,作为文件夹名

cmake_minimum_required(VERSION 3.4.1)

# SHAPE 就是在build.gradle中传来的参数,这里只是修改依赖的头文件
include_directories(src/${SHAPE}/cpp)

# 这里未修改C++代码路径,实际情况可以对源文件路径进行修改,
# 如:src/${SHAPE}/cpp/xxx.cpp
add_library(
        native-lib
        SHARED
        src/main/cpp/native-lib.cpp)

find_library(
        log-lib
        log)

target_link_libraries(
        native-lib
        ${log-lib})

4. 不同渠道的代码

5. 调用接口进行测试

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.append("flavor:");
        tv.append(BuildConfig.FLAVOR);

        tv.append("\njavaGetShape:");
        tv.append(Shape.javaGetShape());

        tv.append("\nnativeGetShape:");
        tv.append(Shape.nativeGetShape());
    }

}

二、运行效果

点击Android Studio右侧的Gradle按钮,选择指定的渠道进行打包,安装并运行,效果如下:

circle渠道 rect渠道
circle.png rect.png

Demo地址

https://github.com/wangshengyang1996/CmakeMultiChannelPackage

上一篇下一篇

猜你喜欢

热点阅读