Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多项目Android构建中排除重复的C共享库(.so)?_Android_C++_Android Ndk_Android Gradle Plugin - Fatal编程技术网

如何在多项目Android构建中排除重复的C共享库(.so)?

如何在多项目Android构建中排除重复的C共享库(.so)?,android,c++,android-ndk,android-gradle-plugin,Android,C++,Android Ndk,Android Gradle Plugin,我在使用两个库模块构建父项目时遇到了“重复文件”冲突,这两个库模块使用相同的libc++\u共享库 (注:请不要认为这是一个“重复的问题”。我已经阅读了几个相关的帖子,这帮助我走了这么远。然而,没有帖子提供了一个适用于我的情况下,涉及NDK文物。 当我只有一个这样的库模块时,构建工作正常。第二个库模块的添加现在正在产生冲突 考虑以下项目结构:1个父项目,2个“子”项目-但每个项目位于同一目录级别(即不分层嵌套) 到目前为止我已经尝试过的 我试图将建议的闭包添加到我的build.gradle文件中

我在使用两个库模块构建父项目时遇到了“重复文件”冲突,这两个库模块使用相同的
libc++\u共享库

(<强>注:请不要认为这是一个“重复的问题”。我已经阅读了几个相关的帖子,这帮助我走了这么远。然而,没有帖子提供了一个适用于我的情况下,涉及NDK文物。 当我只有一个这样的库模块时,构建工作正常。第二个库模块的添加现在正在产生冲突

考虑以下项目结构:1个父项目,2个“子”项目-但每个项目位于同一目录级别(即不分层嵌套)

到目前为止我已经尝试过的

  • 我试图将建议的闭包添加到我的
    build.gradle
    文件中,但我应该将其添加到哪个
    build.gradle
    文件中?我已将闭包添加到
    bgA1
    bgB1
    bgC1
    (一次一个),但没有成功
  • 建议的闭包是使用
    排除'lib/armeabi-v7a/libc++\u shared.so'
    。每个“子”库模块在
    build/lib
    路径下构建
    libc++\u shared.so
    文件。但是,我注意到父库模块将
    libc++\u shared.so
    文件复制到
    jni/armeabi-v7a/libc++\u shared.so下的
    build/exploded aar
    目录结构中。(见上文)闭包是否应改为
    排除“jni/armeabi-v7a/libc++\u共享。so
    (即
    jni
    lib
  • 由于我使用的是Gradle plugin 0.9.1,我尝试使用
    pickFirst
    代替
    exclude
    ,但也没有成功
  • 有人能帮我决定如何为我的给定案例配置“PackageOptions”闭包吗


    谢谢你的帮助

    我也遇到了同样的问题,在exclude或pickFirst上没有运气。所以我用了一个有点难看的变通方法。其思想是在主项目的build目录中创建一个“native libs”文件夹,从ndk库项目中复制所有必需的*.so文件,然后告诉构建系统将这些libs打包到apk中

    在我的主要项目(app项目)中,我明确定义了包含我所依赖的ndk代码的模块列表

    // Ndk stuff. We have to explicitely manage our NDK dependencies
    ext.jniProjects = [project(':ndklib1'), project(':ndklib2'), project(':ndklib3')]
    apply from: '../depend_ndk.gradle'
    
    然后,“dependendk.gradle”是一个包含

    // Build helper for projects that depends on a native library with a NDK part
    // Define the list of ndk library you depend on in project main file :
    //   ext.jniProjects = [project(':ndklib1')]
    //   apply from : 'depend_ndk.gradle'
    buildscript {
        repositories {
            jcenter()
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.12.+'
        }
    }
    import com.android.build.gradle.tasks.PackageApplication
    
    // As a workaround, we create a new 'native-libs' folder in the current project and
    // copy all the .so we depend on into it
    def ndkLibsDir = new File(buildDir, 'native-libs')
    ndkLibsDir.mkdir()
    
    task copyDependingNativeLibs(type: Copy) {
        // Doc for copy http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html
        println 'jniProjects ' + jniProjects
        jniProjects.each {
            from(new File(it.buildDir, 'native-libs')) {
                include '**/*.so'
            }
        }
        into ndkLibsDir
    }
    
    tasks.withType(PackageApplication) { pkgTask ->
        pkgTask.jniFolders = new HashSet<File>()
        pkgTask.jniFolders.add(ndkLibsDir)
        pkgTask.dependsOn copyDependingNativeLibs
    }
    
    //为依赖于具有NDK部件的本机库的项目生成帮助程序
    //在项目主文件中定义所依赖的ndk库列表:
    //ext.jniProjects=[project(':ndklib1')]
    //申请者:'depend\ndk.gradle'
    构建脚本{
    存储库{
    jcenter()
    mavenCentral()
    }
    依赖关系{
    classpath'com.android.tools.build:gradle:0.12.+'
    }
    }
    导入com.android.build.gradle.tasks.PackageApplication
    //作为一种解决方法,我们在当前项目中创建一个新的“本机libs”文件夹,然后
    //复制所有的文件。所以我们依赖它
    def ndkLibsDir=新文件(buildDir,'native libs')
    ndkLibsDir.mkdir()
    任务copyDependingNativeLibs(类型:Copy){
    //复印文件http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html
    println'jniProjects'+jniProjects
    jniProjects.each{
    from(新文件(it.buildDir,'native libs')){
    包括“***.so”
    }
    }
    进入ndkLibsDir
    }
    tasks.withType(PackageApplication){pkgTask->
    pkgTask.jniFolders=new HashSet()
    pkgTask.jniFolders.add(ndkLibsDir)
    pkgTask.dependsOn copyDependingNativeLibs
    }
    
    如何触发PackageApplication?在应用程序中-我没有在调试版本中看到它。。。所以我的调试APK包括。。。谢谢。你说得对,我在让CopyDependengNativeLibs自动运行时遇到了麻烦。我认为将其添加为pkgTask的依赖项不是正确的做法。我还没有时间找到解决方案,所以现在我只是在更改某些本机部分时运行“/gradlew app:copyDependingNativeLibs”。
    // Ndk stuff. We have to explicitely manage our NDK dependencies
    ext.jniProjects = [project(':ndklib1'), project(':ndklib2'), project(':ndklib3')]
    apply from: '../depend_ndk.gradle'
    
    // Build helper for projects that depends on a native library with a NDK part
    // Define the list of ndk library you depend on in project main file :
    //   ext.jniProjects = [project(':ndklib1')]
    //   apply from : 'depend_ndk.gradle'
    buildscript {
        repositories {
            jcenter()
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.12.+'
        }
    }
    import com.android.build.gradle.tasks.PackageApplication
    
    // As a workaround, we create a new 'native-libs' folder in the current project and
    // copy all the .so we depend on into it
    def ndkLibsDir = new File(buildDir, 'native-libs')
    ndkLibsDir.mkdir()
    
    task copyDependingNativeLibs(type: Copy) {
        // Doc for copy http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html
        println 'jniProjects ' + jniProjects
        jniProjects.each {
            from(new File(it.buildDir, 'native-libs')) {
                include '**/*.so'
            }
        }
        into ndkLibsDir
    }
    
    tasks.withType(PackageApplication) { pkgTask ->
        pkgTask.jniFolders = new HashSet<File>()
        pkgTask.jniFolders.add(ndkLibsDir)
        pkgTask.dependsOn copyDependingNativeLibs
    }