将本机模块从 Gradle 实验插件迁移到稳定 Gradle
Migrate Native Module from Gradle Experimental Plugin to Stable Gradle
我有一个 Android 图书馆项目,它通过 Android NDK 在 C/C++ 中有一部分。
该项目半年前开始,所以我们选择使用 Experimental Plugin 因为更好的 NDK 支持。
我现在正在使用 gradle-experimental:0.8.2
。我有一个 com.android.model.native
模块,我想将它迁移到 gradle:2.2.0
。我在 Gradle Android Plugin DSL 中看到的唯一选项是:
- AppExtension:android
com.android.application
个项目的扩展。
- LibraryExtension:android
com.android.library
个项目的扩展。
- TestExtension:android
com.android.test
个项目的扩展。
所以问题是如何在 gradle 中使用稳定的 gradle 插件制作纯原生模块?
这是我当前的原生模块:
apply plugin: 'com.android.model.native'
apply from: "../config.gradle"
def config = ext.configuration
model {
android {
compileSdkVersion = config.compileSdkVersion
buildToolsVersion = config.buildToolsVersion
defaultConfig {
minSdkVersion.apiLevel = config.minimumSdkVersion
targetSdkVersion.apiLevel = config.targetSdkVersion
versionCode = 1
versionName = '1.0'
}
ndk {
moduleName = 'apicore'
platformVersion = config.minimumSdkVersion
cppFlags.add("-std=c++11")
cppFlags.add("-pthread")
cppFlags.add("-fexceptions")
cppFlags.add("-frtti")
stl = "gnustl_static"
abiFilters.addAll(config.targetPlatforms)
ldLibs.addAll(['android', 'log'])
}
sources {
main {
jni {
source {
//include "someFile.txt"
// This is ignored.
exclude "main.cpp"
exclude "misc/APITest.cpp"
exclude "misc/APITest.h"
}
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
}
}
您需要创建 CMakeLists.txt 或 Android.mk 来构建您的“ libapicore.so",如果你想移动到稳定的 gradle 插件。
我认为您应该执行后续步骤:
- 为了便于迁移,请将您的 .h, .c, .cpp 移动到
root_folder_of_project\app\src\main\cpp
也添加CMakeLists.txt。它应该看起来像:
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
add_library(apicore SHARED
#here add your cpp sources
mysource1.cpp
mysource2.cpp
#do not include main.cpp misc/APITest.cpp misc/APITest.h
)
#include libraries needed for apicore lib
target_link_libraries(apicore
android
log
)
现在重写您应用的 build.gradle 并将其指向 CMakeLists.txt:
apply plugin: 'com.android.application'
android {
compileSdkVersion = 25
buildToolsVersion = '25.0.2'
defaultConfig {
applicationId = 'com.your.app'
minSdkVersion 16
targetSdkVersion 25
ndk {
abifilters 'armeabi-v7a' /*,'armeabi', etc.*/
}
externalNativeBuild {
cmake {
arguments '-DANDROID_PLATFORM=android-19',
'-DANDROID_TOOLCHAIN=clang', /*or gcc*/
'-DANDROID_CPP_FEATURES=rtti',
'-DANDROID_CPP_FEATURES=exceptions',
'-DANDROID_STL=gnustl_static' /*CMake uses by default*/
}
}
}
buildTypes {...}
externalNativeBuild {
cmake {
path 'src/main/cpp/CMakeLists.txt'
}
}
}
dependencies {...}
有了这个,你将构建你的 android 应用程序,其中包含你的原生 "libapicore.so"。
我刚刚从 Gradle Experimental Plugin to Gradle plugin for Android 迁移了我的项目。 Android 的当前 Gradle 插件仍未提供实验性插件提供的 com.android.model.native 扩展,即创建纯本机模块的能力。我必须意识到我什至不需要那个。我为替换 com.android.model.native 模块所做的是我制作了一个库模块,我在其中处理本机代码和构建我的本机库,我只是在需要它们的地方复制本机库。当然,模块会生成 .aar,但这不是问题,我只是不使用它。
我有一个 Android 图书馆项目,它通过 Android NDK 在 C/C++ 中有一部分。
该项目半年前开始,所以我们选择使用 Experimental Plugin 因为更好的 NDK 支持。
我现在正在使用 gradle-experimental:0.8.2
。我有一个 com.android.model.native
模块,我想将它迁移到 gradle:2.2.0
。我在 Gradle Android Plugin DSL 中看到的唯一选项是:
- AppExtension:android
com.android.application
个项目的扩展。 - LibraryExtension:android
com.android.library
个项目的扩展。 - TestExtension:android
com.android.test
个项目的扩展。
所以问题是如何在 gradle 中使用稳定的 gradle 插件制作纯原生模块?
这是我当前的原生模块:
apply plugin: 'com.android.model.native'
apply from: "../config.gradle"
def config = ext.configuration
model {
android {
compileSdkVersion = config.compileSdkVersion
buildToolsVersion = config.buildToolsVersion
defaultConfig {
minSdkVersion.apiLevel = config.minimumSdkVersion
targetSdkVersion.apiLevel = config.targetSdkVersion
versionCode = 1
versionName = '1.0'
}
ndk {
moduleName = 'apicore'
platformVersion = config.minimumSdkVersion
cppFlags.add("-std=c++11")
cppFlags.add("-pthread")
cppFlags.add("-fexceptions")
cppFlags.add("-frtti")
stl = "gnustl_static"
abiFilters.addAll(config.targetPlatforms)
ldLibs.addAll(['android', 'log'])
}
sources {
main {
jni {
source {
//include "someFile.txt"
// This is ignored.
exclude "main.cpp"
exclude "misc/APITest.cpp"
exclude "misc/APITest.h"
}
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
}
}
您需要创建 CMakeLists.txt 或 Android.mk 来构建您的“ libapicore.so",如果你想移动到稳定的 gradle 插件。
我认为您应该执行后续步骤:
- 为了便于迁移,请将您的 .h, .c, .cpp 移动到
root_folder_of_project\app\src\main\cpp
也添加CMakeLists.txt。它应该看起来像:
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
add_library(apicore SHARED #here add your cpp sources mysource1.cpp mysource2.cpp #do not include main.cpp misc/APITest.cpp misc/APITest.h )
#include libraries needed for apicore lib target_link_libraries(apicore android log )
现在重写您应用的 build.gradle 并将其指向 CMakeLists.txt:
apply plugin: 'com.android.application'
android {
compileSdkVersion = 25 buildToolsVersion = '25.0.2'
defaultConfig { applicationId = 'com.your.app' minSdkVersion 16 targetSdkVersion 25 ndk { abifilters 'armeabi-v7a' /*,'armeabi', etc.*/ } externalNativeBuild { cmake { arguments '-DANDROID_PLATFORM=android-19', '-DANDROID_TOOLCHAIN=clang', /*or gcc*/ '-DANDROID_CPP_FEATURES=rtti', '-DANDROID_CPP_FEATURES=exceptions', '-DANDROID_STL=gnustl_static' /*CMake uses by default*/ } } }
buildTypes {...}
externalNativeBuild { cmake { path 'src/main/cpp/CMakeLists.txt' } }
}
dependencies {...}
有了这个,你将构建你的 android 应用程序,其中包含你的原生 "libapicore.so"。
我刚刚从 Gradle Experimental Plugin to Gradle plugin for Android 迁移了我的项目。 Android 的当前 Gradle 插件仍未提供实验性插件提供的 com.android.model.native 扩展,即创建纯本机模块的能力。我必须意识到我什至不需要那个。我为替换 com.android.model.native 模块所做的是我制作了一个库模块,我在其中处理本机代码和构建我的本机库,我只是在需要它们的地方复制本机库。当然,模块会生成 .aar,但这不是问题,我只是不使用它。