2016-12-01 74 views
-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中看到的唯一选项是:将原生模块从Gradle实验性插件迁移到稳定Gradle

  • AppExtension:android extension for com.android.application projects。
  • 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')) 
      } 
     } 
    } 
} 
+1

我不明白你真正想要什么。把你的应用程序'classpath'的'build.gradle'放到com.android.tools.build:gradle:2.2.2''中,告诉我们当你的应用程序完成项目的构建时发生了什么。 –

+0

稳定的gradle没有'com.android.model.native'插件 – emKaroly

+0

这是您的应用程序的'build.gradle',这个项目还有另一个'build.gradle'。在那里你可以找到你的Gradle的版本。 –

回答

0

我刚刚将我的项目从Gradle Experimental Plugin迁移到Gradle plugin for Android。 Android的当前Gradle插件仍然没有提供com.android.model。本地扩展从实验性插件提供,这是一种能够创建纯本地模块。我必须认识到,我甚至不需要这个。我做了什么来取代com.android.model.native模块是我做了一个库模块,我处理本地代码和我的本地库的建设,我只是复制我需要它们的本地库。当然模块会生成.aar,但这不是问题,我只是不使用它。

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'
    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”内。

+0

谢谢你的回答,你把它包装得很好。问题是,这种方式我基本上合并我的应用程序模块,这是纯粹的Java和Android的东西纯C/C++的东西。从我的角度来看,应用程序应至少分为三部分:1.主要的Android应用程序模块2. JNI/NDK的东西(用于c/C++的包装)3. C/C++的东西 – emKaroly

+0

好的,理解。有可能的。你有没有看到[google github](https://github.com/googlesamples/android-ndk/tree/master/hello-libs)的** hello-libs **示例?这可以回答你的问题。但它分为两部分:1)主要的Android App模块; 2)JNI/NDK的东西+ C/C++的东西 – Sheikh