An Android Project with more than one module,the app module(some api developed by jni) depend on an Android Library which has native so.
该项目是一个使用Android Studio创建的,通过gradle编译的,存在多个模块的工程的gradle构建的事例。其中存在多个模块的工程中包含:
Github:https://github.com/bihe0832/Android-gradle-jni-so
扫码下载APK:
准备工作
下面的两种方式都可以运行,不过运行之前要先根据自己的网络环境修改下面几个文件。
运行方式
在项目中存在两个Android Studio的工程
GradleTest是核心工程,它里面包含了一个Android Library的模块gradletestlibrary和一个Android Application的模块app。
gradletestlibrary
一个Android Library的模块,他引入了第三方的so和jar(MD5工程的编译产出),并对第三方的jar和so做了封装和调用。
app
一个Android Application的模块,他引用gradletestlibrary,同时里面包含jni的代码,通过native的方式调用gradletestlibrary提供的方法。
一个普通的Android 工程,他包含java和jni代码,最终打包后对外提供jar包和so。模拟第三方的jar和so提供给GradleTest使用。
Android-gradle-jni-so
│
├─── build.sh 生成最终产出物的简单构建脚本,直接运行会生成最终的资源、apk和核心文件
│
├─── GradleTest 核心工程,一个存在多个Module的Android工程
│ │
│ ├── app 基于Android Application的模块,引用gradletestlibrary,通过native的方式调用接口。
│ │
│ └── gradletestlibrary 基于Android Library的模块,引入MD5提供的jar和so
│
├─── MD5 普通Android工程,他包含java和jni代码,最终打包后对外提供jar包和so
│
└─── README.md 项目工程介绍
下面用图示简单梳理demo中获取大写md5值的函数调用流程
说实话,这么设计一个工程是有点复杂,但是却存在实实际际的使用场景。上面的工程是自己根据一直以来SDK开发时实际经验总结,下面对该事例中的两个工程以及对应模块做个现实中的身份映射。
首先、这个完整的架构是主要是提供给SDK的开发者或者大型项目存在公共代码库的情况下使用的。如果项目代码很少,确实不用搭建如此复杂的框架。
build.gradle 代码如下:
buildscript {
……
dependencies {
classpath "com.android.tools.build:gradle-experimental:0.2.+"
}
}
gradle-wrapper.properties 内容如下:
#Tue Dec 15 16:08:58 CST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-2.5-all.zip
当时写这个事例的时候gradle-experimental插件的0.2版本刚出,发现他对一些语法规则做了调整,不兼容Android gradle插件标准版的语法。也是因为这个原因当时写了对应的文档和事例。
前段时间再去看官方关于gradle experimental的介绍的时候惊诧的发现,最新版本的gradle-experimental插件的语法又部分改回了主流版本的语法规则,就悲催的发现这篇文章仅供参考了。因此这几天彻底重新调整了目录,方便后续编译。