2014-06-24 7 views

cevap

1

Bunu, bağımsız bir Android yerel eklentisiyle experimental gradle plugin family'dan elde edebilirsiniz. Yeni eklentiler, gradle component approach towards modeling builds dayanmaktadır. many advantages to using the new system vardır. Örneğin

:

root 
+ lib -> 'com.android.model.native' 
+ lub -> 'com.android.model.native' 
+ aar -> 'com.android.model.library' 
+ app -> 'com.android.model.application' 

build.gradle

configure([project(':lib'), project(':lub'), project(':aar'), project(':app')]) { 
    buildscript { 
     repositories { 
      jcenter() 
     } 
     dependencies { 
      classpath 'com.android.tools.build:gradle-experimental:0.6.0-alpha5' 
     } 
    } 
} 

lib/build.gradle

apply plugin: "com.android.model.native" 

model { 
    android { 
     compileSdkVersion 23 
    ndk { 
     moduleName "foo" 
    } 
    sources { 
     main { 
      jni { 
       exportedHeaders { 
        srcDir "src/main/headers" 
       } 
      } 
     } 
    } 
} 

lub/build.gradle

apply plugin: "com.android.model.native" 

model { 
    android { 
     compileSdkVersion 23 
    ndk { 
     moduleName "bar" 
    } 
    sources { 
     main { 
      jni { 
       exportedHeaders { 
        srcDir "include" 
       } 
      } 
     } 
    } 
} 

AAR/build.gradle

apply plugin: "com.android.model.library" 

model { 
    android { 
     buildToolsVersion '23.0.2' 
     compileSdkVersion 23 
    ndk { 
     moduleName "aggregate-jni" 
     stl "stlport_shared" // using cpp? 
    } 
    sources { 
     main { 
      jni { 
       dependencies { 
        project ":lib" 
        project ":lub" 
       } 
      } 
     } 
    } 
}  

uygulama/build.gradle

apply plugin: 'com.android.model.application' 

model { 
    android { 
     buildToolsVersion '23.0.2' 
     compileSdkVersion 23 

     defaultConfig { 
      applicationId "com.example.app" 
      minSdkVersion.apiLevel 21 
      targetSdkVersion.apiLevel 23 
      versionCode 1 
      versionName "1.0" 
     } 
    } 
} 

dependencies { 
    compile project(':aar') 
} 

bağlantı dinamik ise (NDK için varsayılan), AAR içerecektir :

libfoo.so libbar.so libaggregate-jni.so libstlport.so 

ve ayna java sınıflarınız. Java sınıflarınızda ve başvurulan kitaplıklar da

belgelerini yükleyebilir. Bağlantı statik ise, yine de tek bir libaggregate-jni.so ile sonuçlanacaksınız. end up with multiple copies of the stl in your binary'u kullanacağınız gibi, bir grup şeyi statik olarak stl'ye bağlamak kötü olduğunu unutmayın. Bu gerçekten şeyleri mahvedebilir.

Varsayılan gcc toolchain is now deprecated olduğunu unutmayın. Kullanımı en iyisi:

model { 
    android { 
     ndk { 
      toolchain 'clang' 
      stl 'c++_shared' 
     } 
    } 
} 

Son olarak, kesinlikle bir AAR gerekmez, ben sadece bütünlüğü sağlamak için dahil. Uygulama eklentisi de ndk'yi tam olarak desteklediğinden, uygulama projesi doğrudan bağımsız yerel lib projelerine bağlı olabilir.

+0

C'deki deneyimim sınırlıdır, bu nedenle bir çift bilgisizlik için özür dileriz: 1) 'lub' nedir? 2) Dışa aktarılan başlıklar alanı, yalnızca c başlık dosyalarının yeridir, özel bir şey değil mi? Daha önce LOCAL_C_INCLUDES ile beslenen şey aynı mıydı? – Anthony

+0

@Anthony re # 2 evet. Bağlandığınız bileşenin genel API'sini oluşturan başlıkların konumu. Diğer sınıf projeleri, bağlı oldukları bileşenler için başlıkların nerede bulunacağını bilmelidir. – dcow

+0

Birden çok bağımlılık başarıyla oluşturdunuz mu? 'bağımlılıkları { projesi": lib " projesi": lub " }' yalnızca ilk projeyi alır. Onları eksik bağımlılıklar değiştirirseniz değiştiririm, ancak her ikisini de eklemiyor gibi görünüyor. – Anthony