使用gradle构建和链接多个NDK库

时间:2014-06-24 13:56:36

标签: android-ndk gradle

我有一个Android项目,它将一堆资源链接到一个单一的JNI库中。我想将这个单独的库拆分成多个较小的库,它们之间有一些依赖关系。如何使用新的gradle构建系统实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以使用experimental gradle plugin family中的独立Android原生插件实现此目的。新插件基于gradle component approach towards modeling builds。有many advantages to using the new system

例如:

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"
                }
            }
        }
    }
}

<强>滑油/的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"
                }
            }
        }
    }
}    

应用/的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')
}

如果链接是动态的(默认为ndk),则aar将包含:

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

和你的镜像java类。你可以简单地

System.load("aggregate-jni");
你的java类中的

和引用的库也会加载。如果链接是静态的,那么无论如何你都会得到一个libaggregate-jni.so。请注意,按照end up with multiple copies of the stl in your binary将静态链接到stl是很糟糕的。这真的搞砸了。

请注意默认gcc toolchain is now deprecated。最好使用:

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

最后,你绝对不需要aar,我只是为了完整而包含它。应用程序项目可以直接依赖于独立的本机lib项目,因为应用程序插件也完全支持ndk。