summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEder Bastos <bastos.eder@gmail.com>2015-05-18 20:22:01 -0400
committerEder Bastos <bastos.eder@gmail.com>2015-05-18 21:20:43 -0400
commit9c19d91e1815d71f74853434b5e8e34d8871b67a (patch)
tree6d227bb795406c9db44c0ee254b4983565158108
parent7e6ec5fa869a9d62699639f6775ccccbd52b3c2a (diff)
Android: Allow building of native libraries inside Android Studio / Gradle
-rw-r--r--Readme.md28
-rw-r--r--Source/Android/.gitignore3
-rw-r--r--Source/Android/app/build.gradle54
3 files changed, 72 insertions, 13 deletions
diff --git a/Readme.md b/Readme.md
index 31cea22eff..f1f6e4d431 100644
--- a/Readme.md
+++ b/Readme.md
@@ -56,18 +56,22 @@ Gradle task `assembleDebug` to build, or `installDebug` to install the UI onto a
In order to launch the app, you must build and include the native Dolphin libraries into the UI project.
Building native code requires the [Android NDK](https://developer.android.com/tools/sdk/ndk/index.html).
-
-### Build Steps:
-1. `mkdir Build-Android-<abi>`
-2. `cd Build-Android-<abi>`
-3. `cmake -DANDROID=True -DANDROID_NDK=<ndk-path> -DANDROID_NATIVE_API_LEVEL=android-18 -DANDROID_TOOLCHAIN_NAME=<toolchain> -DANDROID_ABI=<abi> -DCMAKE_TOOLCHAIN_FILE=../Source/Android/android.toolchain.cmake -DGIT_EXECUTABLE=<git-path> ..`
-4. `make`
-
-Replace `<git-path>` with the absolute path to your machine's Git executable, <ndk-path> with the absolute
-path to where you installed your NDK, and the rest depending on which platform the Android device you are
-targeting uses:
-
-|Platform | abi | toolchain |
+Android Studio will do this for you if you create `Source/Android/build.properties`, and place the
+following inside:
+
+```
+gitPath=<git-path>
+ndkPath=<ndk-path>
+toolchain=<toolchain>
+abi=<abi>
+makeArgs=<make-args>
+```
+
+Replace `<git-path>` with the absolute path to your machine's Git executable, `<ndk-path>` with the absolute
+path to where you installed your NDK, `<make-args>` with any arguments you want to pass to `make`, and the
+rest depending on which platform the Android device you are targeting uses:
+
+|Platform | `<abi>` | `<toolchain>` |
|-------------------------|-------------|---------------------------|
|ARM 32-bit (most devices)| armeabi-v7a | arm-linux-androideabi-4.9 |
|ARM 64-bit (i.e. Nexus 9)| arm64-v8a | aarch64-linux-android-4.9 |
diff --git a/Source/Android/.gitignore b/Source/Android/.gitignore
index 78ddc4f68d..a053548512 100644
--- a/Source/Android/.gitignore
+++ b/Source/Android/.gitignore
@@ -39,4 +39,5 @@ tasks.xml
gradle/
build/
*.so
-*.iml \ No newline at end of file
+*.iml
+build.properties \ No newline at end of file
diff --git a/Source/Android/app/build.gradle b/Source/Android/app/build.gradle
index ae34d82377..50ec4b23e0 100644
--- a/Source/Android/app/build.gradle
+++ b/Source/Android/app/build.gradle
@@ -41,6 +41,10 @@ android {
applicationIdSuffix ".debug"
versionNameSuffix '-debug'
jniDebuggable true
+
+ tasks.withType(JavaCompile) {
+ compileTask -> compileTask.dependsOn(compileNative)
+ }
}
}
}
@@ -58,3 +62,53 @@ dependencies {
// For loading huge screenshots from the disk.
compile 'com.squareup.picasso:picasso:2.5.2'
}
+
+task setupCMake(type: Exec) {
+ // Check if a build properties file exists.
+ def propsFile = rootProject.file("build.properties")
+
+ // If it does, call CMake.
+ if (propsFile.canRead()) {
+ // Read the properties file's contents.
+ def buildProperties = new Properties()
+ buildProperties.load(new FileInputStream(propsFile))
+
+ mkdir('build/' + buildProperties.abi)
+ workingDir 'build/' + buildProperties.abi
+
+ executable 'cmake'
+
+ args "-DANDROID=true",
+ "-DANDROID_NATIVE_API_LEVEL=android-18",
+ "-DCMAKE_TOOLCHAIN_FILE=../../../android.toolchain.cmake",
+ "../../../../..",
+ "-DGIT_EXECUTABLE=" + buildProperties.gitPath,
+ "-DANDROID_NDK=" + buildProperties.ndkPath,
+ "-DANDROID_TOOLCHAIN_NAME=" + buildProperties.toolchain,
+ "-DANDROID_ABI=" + buildProperties.abi
+ } else {
+ executable 'echo'
+ args 'No build.properties found; skipping CMake.'
+ }
+}
+
+task compileNative(type: Exec, dependsOn: 'setupCMake') {
+ // Check if a build properties file exists.
+ def propsFile = rootProject.file("build.properties")
+
+ // If it does, call make.
+ if (propsFile.canRead()) {
+ // Read the properties file's contents.
+ def buildProperties = new Properties()
+ buildProperties.load(new FileInputStream(propsFile))
+
+ workingDir 'build/' + buildProperties.abi
+
+ executable 'make'
+
+ args buildProperties.makeArgs
+ } else {
+ executable 'echo'
+ args 'No build.properties found; skipping native build.'
+ }
+} \ No newline at end of file