-2

我有一个 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:com.android.application项目的android扩展。
  • LibraryExtension:com.android.library项目的 android 扩展。
  • TestExtension:com.android.test项目的android扩展。

所以问题是如何用稳定的 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'))
            }
        }
    }
}
4

2 回答 2

1

我刚刚将我的项目从Gradle Experimental Plugin迁移到Gradle plugin for Android。当前适用于 Android 的 Gradle 插件仍然没有提供实验性插件提供的 com.android.model.native 扩展功能,即创建纯原生模块的能力。我必须意识到我什至不需要那个。我为替换 com.android.model.native 模块所做的是我创建了一个库模块,我在其中处理本机代码和构建我的本机库,我只是在我需要的地方复制本机库。当然模块会生成.aar,但这不是问题,我只是不使用它。

于 2017-04-27T08:25:20.617 回答
1

如果您想迁移到稳定的 gradle 插件,您将需要创建CMakeLists.txtAndroid.mk来构建您的“ libapicore.so ”。
我认为您应该执行以下步骤:

  1. 为了便于迁移,请将您的.h、.c、.cpp移动到

    root_folder_of_project\app\src\main\cpp
  2. 还要添加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 )

  3. 现在重写您的应用程序的 build.gradle 并将其指向 CMakeLists.txt:这样您将使用您的本机“libapicore.so”

    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 应用程序。

于 2016-12-19T04:13:15.963 回答