2016-12-01 77 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