Gradle快速构建(二)gradle构建NDK编译环境

在我的文章如何使用AndroidStudio-Cmake中有说过在gradle配置jni环境,本章主要更加细致的介绍如何配置一些自定义的选项,比如选择ndk版本编译,编译不同的库,cmake编译下配置引用不同的C++ libd等。


具体的一些语法请参照我的Groovy语法学习两章

一 mk编译下自定义ndk编译指令

在发布我们的lib库时,想给别人,但是可能考虑到人家没有配置ndk全局环境变量怎么办,我们可以通过从local.properties中获取,当前AS NDK的配置路径,去手动指定ndk编译器编译j’ni库,当然,这是基于Android.mk编译jni的情况下

注意配置NDK许可,这个在新版本被去除了,改成了通过externalNativeBuild 声明,老版本是在gradle.properties添加:

android.useDeprecatedNdk=true

1. 获取NDK路径

  • 在gradle根目录下添加

      String getNdkBuildPath() {
      	Properties properties = new Properties()
      	properties.load(project.rootProject.file('local.properties').newDataInputStream())
      	def ndkBuildingDir = properties.getProperty("ndk.dir")
      	def ndkBuildPath = ndkBuildingDir
      	if (Os.isFamily(Os.FAMILY_WINDOWS)) {//需要判断系统版本
      		ndkBuildPath = ndkBuildingDir + '/ndk-build.cmd'
      	} else {
      		ndkBuildPath = ndkBuildingDir + '/ndk-build'
      	}
      	return ndkBuildPath
      }
    

2. 执行ndk编译指令

task ndkBuild(type: Exec, description: 'Compile JNI source') {
	println('executing ndkBuild')
	def ndkBuildPath = getNdkBuildPath();
	commandLine ndkBuildPath, '-j8', '-C', file('src/main').absolutePath
}

tasks.withType(JavaCompile) {
	compileTask -> compileTask.dependsOn ndkBuild
}

task ndkClean(type: Exec, description: 'clean JNI libraries') {
	println('executing ndkBuild clean')
	def ndkBuildPath = getNdkBuildPath();
	commandLine ndkBuildPath, 'clean', '-C', file('src/main').absolutePath
}

clean.dependsOn 'ndkClean'

3. 指定静态库的引用路径

通过上述任务执行编译,基于.mk的编译脚本,通过执行ndk库编译,它生成的静态库文件也位于mian/src/libs,我们知道AS的缺省引用路径在jniLibs,所以我们还需要指定.so的引用路径。以及去除AS对jni的自动编译选项

sourceSets.main {
	jniLibs.srcDir 'src/main/libs'
	jni.srcDirs = [] //disable automatic ndk-build call
}

二 cmake编译选项配置

cmake用起来感觉比mk脚本方便一点,在某些大型jni项目时,更具灵活性,我们在编译jni代码时,可以在CMakeLists.txt中配置几乎所有参数,当然,也可以选择将一部分配置放到gradle中配置,这样可以更直观的看到我们配置参数,并且修改起来也更加方便。

1.配置AS编译方式

  • 选择CMakeLists.txt编译方式

      android {
      	externalNativeBuild {
      	  cmake {
      	      path "CMakeLists.txt"
      	  }
      	} 
      }
    
  • android.mk编译方式

      externalNativeBuild {
          ndkBuild {
              path 'src/main/jni/Android.mk'  //你的android.mk目录
              path 'src/main/jni/Application.mk'  //Application.mk目录
          }
      }
    

2.配置C++编译参数

指定一些编译宏参数和格式,指定编译的平台版本

android {
	defaultConfig {    
		// This block is different from the one you use to link Gradle
		// to your CMake or ndk-build script.
		externalNativeBuild {
			// For ndk-build, instead use ndkBuild {}
			cmake {
			  // Cmake可选参数
			  arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
			
			  // 选择C编译的标记,选一个即可
			  cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"
			
			  // C ++宏常量格式
			  cppFlags "-D__STDC_FORMAT_MACROS"
			}
		}
	ndk {
		// 指定编译的ABI,选择你项目需要的abi即可
		abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
	         'arm64-v8a'
	}
}

3.JNI分包打包配置

gradle android根目录

//分包打包,可指定不同的编译版本
productFlavors {   
  one {
    externalNativeBuild {
      cmake {
        targets "native-lib-1"
      }
    }
  }
  two {     
    externalNativeBuild {
      cmake {        
        targets "native-lib-2"
      }
    }
  }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值