【问题标题】:Migrate Native Module from Gradle Experimental Plugin to Stable Gradle将 Native Module 从 Gradle Experimental Plugin 迁移到 Stable Gradle
【发布时间】:2016-12-01 11:21:26
【问题描述】:

我有一个通过Android NDK 使用 C/C++ 的 Android 库项目。 该项目是半年前开始的,所以我们选择使用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'))
            }
        }
    }
}

【问题讨论】:

  • 我不明白你真正想要什么。将您的应用程序classpath 'com.android.tools.build:gradle:2.2.2'build.gradle 放入并告诉我们当您的应用程序完成项目构建时会发生什么。
  • 稳定的gradle没有com.android.model.native插件
  • 这是您的应用程序build.gradle,项目还有另一个build.gradle。在那里你可以找到你的 gradle 版本。
  • @RodrigoPaixão 我可以更改我的 gradle 版本,这不是问题。稳定的 gradle 没有本机模块。你真的不明白我想要什么。我正在使用这个:tools.android.com/tech-docs/new-build-system/…
  • 我有同样的问题,遗憾的是迁移指南没有提及任何内容。在 gradle 2.2 和 ndk 的 googlesamples 中,他们避免使用本机库模块,而是只有一个构建所有库的脚本,这似乎是目前唯一的选择。参考 gradle-experimental sample with com.android.model.native github.com/googlesamples/android-ndk/tree/gradle-experimental/…, ndk-build sample without github.com/googlesamples/android-ndk/tree/master-ndkbuild/…

标签: android android-studio gradle cmake gradle-experimental


【解决方案1】:

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

  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:

    apply plugin: 'com.android.application'

    android {
    compileSdkVersion = 25 buildToolsVersion = '25.0.2'
    @987654330 @

    buildTypes {...}

    externalNativeBuild { cmake { path 'src/main/cpp/CMakeLists.txt' } }
    }

    dependencies {...}

    有了这个,您将构建您的 android 应用程序,其中包含您的原生 "libapicore.so"

【讨论】:

  • 谢谢你的回答,你把它包得很好。问题是,通过这种方式,我基本上是在将纯 java 和 android 的应用程序模块与纯 c/c++ 的东西合并。从我的角度来看,应用程序至少应该分为 3 个部分:1. 主要的 Android 应用程序模块 2. JNI/NDK 的东西(c/c++ 的包装器) 3. C/C++ 的东西
  • 好的,明白了。有可能的。您是否看到来自 google githubhello-libs 示例?这可以回答你的问题。但它分为两部分:1)主要的Android App模块; 2) JNI/NDK 的东西 + C/C++ 的东西
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2022-11-23
    相关资源
    最近更新 更多