最近有个项目需求,根据不同的渠道要修改不同的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
网友评论