美文网首页
Android cmake多渠道打包配置

Android cmake多渠道打包配置

作者: 省油的灯_wsy | 来源:发表于2019-12-10 22:38 被阅读0次

    最近有个项目需求,根据不同的渠道要修改不同的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. 不同渠道的代码

    • circle渠道

      • src\circle\java\com\wsy\cmakemultichannelpackage\Shape.java
      package com.wsy.cmakemultichannelpackage;
      
      public class Shape {
          public static native String nativeGetShape();
          public static String javaGetShape(){
              return "circle";
          }
      }
      
      • src\circle\cpp\config.h
       //
       // Created by Administrator on 2019/12/10.
       //
      
      #ifndef CMAKEMULTICHANNELPACKAGE_SHAPE_H
      #define CMAKEMULTICHANNELPACKAGE_SHAPE_H
      
      #endif //CMAKEMULTICHANNELPACKAGE_SHAPE_H
      const char* getShape(){
          return "circle";
      }
      
    • rect渠道

      • src\rect\java\com\wsy\cmakemultichannelpackage\Shape.java
      package com.wsy.cmakemultichannelpackage;
      
      public class Shape {
          public static native String nativeGetShape();
          public static String javaGetShape(){
              return "rect";
          }
      } 
      
      • src\rect\cpp\config.h
       //
       // Created by Administrator on 2019/12/10.
       //
      
      #ifndef CMAKEMULTICHANNELPACKAGE_SHAPE_H
      #define CMAKEMULTICHANNELPACKAGE_SHAPE_H
      
      #endif //CMAKEMULTICHANNELPACKAGE_SHAPE_H
      const char* getShape(){
          return "rect";
      }
      

    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

    相关文章

      网友评论

          本文标题:Android cmake多渠道打包配置

          本文链接:https://www.haomeiwen.com/subject/qzlngctx.html