JNI与gradle

时间:2016-07-17 16:08:50

标签: c gradle java-native-interface

如何使用gradle构建共享库?

我的项目树

  

core / c / {*。c,*。h}

     

core / c / include / {jni,lib}

我的build.gradle

apply plugin: 'c'

def JNI_INCLUDE_DIR = this.properties['jni.include.dir']

model {
        components {
                bridge(NativeLibrarySpec) {
                        sources.c.source {
                                srcDir 'core/c'
                                include '**/*.c'
                        }
                        sources.c.exportedHeaders {
                                srcDir 'core/c/include'
                        }
                        buildTypes {
                                debug
                                release
                        }
                }
        }
toolChains {
                gcc(Gcc) {
                        if(System.properties['os.name'].equals("Mac OS X")) {
                                cCompiler.withArguments {
                                        args << "-I" + JNI_INCLUDE_DIR
                                        args << "-I" + JNI_INCLUDE_DIR + "/darwin"
                                        args << "-std=gnu11"
                                        args << "-g"
                                }
                        } else {
                                cCompiler.withArguments {
                                        args << "-I" + JNI_INCLUDE_DIR
                                        args << "-I" + JNI_INCLUDE_DIR + "/linux"
                                        args << "-std=gnu11"
                                        args << "-g"
                                }
                        }
                }
        }
}

错误

  

执行模型规则时抛出异常:toolChains {...} @ build.gradle第23行,第2列   无法获得未知财产&#c; cCompiler&#39;对于工具链&#39; gcc&#39; (GNU GCC)类型为org.gradle.nativeplatform.toolchain.internal.gcc.GccToolChain。

1 个答案:

答案 0 :(得分:0)

The Gcc class没有属性cCompiler,这就是您收到错误的原因。 cCompilerGccPlatformToolchain的属性。 Gcc有一个或多个平台工具链实例。如果您要将标记应用于Gcc工具链中的每个平台,则可以使用eachPlatform,例如:

toolChains {
    gcc(Gcc) {
        eachPlatform {
            if(System.properties['os.name'].equals("Mac OS X")) {
                cCompiler.withArguments {
                    args << "-I" + JNI_INCLUDE_DIR
                    args << "-I" + JNI_INCLUDE_DIR + "/darwin"
                    args << "-std=gnu11"
                    args << "-g"
                }
            } else {
                cCompiler.withArguments {
                    args << "-I" + JNI_INCLUDE_DIR
                    args << "-I" + JNI_INCLUDE_DIR + "/linux"
                    args << "-std=gnu11"
                    args << "-g"
                }
            }
        }
    }
}

我相信您也可以为给定的操作系统/体系结构定义自定义平台,然后引用Gcc块内的自定义平台,而不是使用if语句,这可能更清晰,更具惯用性。