Nitro's

May 4, 2015 - Comments - tech dev

Android Studio编译NDK工程

由于现在的开发都是基于AS的,但是当前AS对NDK的支持还不是特别完善,再切换ADT略显别扭,简单根据NDK文档写了一个Gradle脚本,来调用NDK ENV来编译。

目前的脚本仅能实现对*.c的编译,对NativeActivity的支持还不是特别完善。

主要分为3个步骤:

1)NDK编译链环境检查

2)编译

3)迁移编译后so文件、清理文件夹

//新建NDK compile任务
task compileNDK << {
        // TAG
        String TAG = ":" + project.getProject().name + ":ndk:"
        // Check NDK environment
        Properties properties = new Properties()
        properties.load(project.rootProject.file('local.properties').newDataInputStream())
        def ndkDir = properties.getProperty('ndk.dir')

        if (ndkDir == null) {
            System.err.println("ndk not found,please set (ndk dir) in local.properties")
            System.exit(-1)
        } else {

            println TAG + ndkDir
            // NDK build command
            String NDK_CMD = ndkDir + "/ndk-build"
            // NDK target project path
            def env = ["NDK_PROJECT_PATH=${project.getProject().getProjectDir().getAbsolutePath()}" + "/src/main/"]
            def moduleSrcPath = project.getProject().getProjectDir().getAbsolutePath() + "/src/main"

            println TAG + "start compiling"

            Process p = NDK_CMD.execute(env, null)
            println TAG + "${p.text}"
            if (p.exitValue() != 0) {

                System.err.println TAG + "interrupted"
                System.exit(-1)
            } else {
                // delete obj folder
                def obj = new File(moduleSrcPath + "/obj/")
                if (obj.deleteDir()) {
                    println TAG + "delete obj folder"
                } else {
                    println TAG + "can't delete obj folder,please manual delete it"
                }

                File soFolder = new File(moduleSrcPath + "/libs")
                //clear jniLibs
                File jniLibFolder = new File(moduleSrcPath + "/jniLibs")
                deleteFile(jniLibFolder)
                jniLibFolder.mkdir()
                //move path
                def otherFiles = false
                soFolder.eachFile {

                    if (!it.name.toUpperCase().endsWith(".JAR")) {

                        println TAG + "move so file " + it.name + " " + it.renameTo(new File(moduleSrcPath + "/jniLibs", it.name))
                        deleteFile(it)
                    } else {
                        otherFiles = true;
                    }
                }
                //if libs folder is null and delete it
                if (!otherFiles) {
                    deleteFile(soFolder)
                }

                //
                println TAG + "SUCCESS"
            }
        }
    }

将脚本放入build.gradle的android标记内。

然后将这个任务添加到编译过程中

    tasks.whenTaskAdded {
        task ->
            if (task.name == 'generateDebugBuildConfig') {
                task.dependsOn compileNDK
            }
    }

Tags: android gradle

Android Gradle相关浅析 PHPStorm配置Debugger模式

comments powered by Disqus