which cmake will Android plugin use? - android-studio

With Android Studio 3.3 I use native (C++) library, which I built with CMake. The Android plugin (v. 3.2.1) will choose the 'builtin' or 'external' cmake, depending on the configuration of externalNativeBuild, as documented at developer.android.com.
I want to add an extra custom task (install) that should use the same cmake version as the Android Plugin. But even with the 'builtin' cmake, it's not clear what the path is. I can find android.sdkDirectory, but even there I have today sdk\cmake\3.6.4111459 and sdk\cmake\3.10.2.4988404, and for some strange reason, some of my projects choose 3.6, while others use 3.10. This contradicts the official the release notes for Android Studio that "Gradle still uses version 3.6.0 by default", but well…
How can I decide which to use, without reimplementing the Android Plugin's obscure logic?
One workaround that may help, parse the first line of the generated file .externalNativeBuild/cmake/debug/armeabi-v7a/cmake_build_command.txt:
Executable : C:\local\Android\sdk\cmake\3.10.2.4988404\bin\cmake.exe
This still needs some adjustments, because the later versions of build tools will use .cxx instead of .externalNativeBuild; the build variant names may be different too.

Android Studio will pick up the latest CMake version under sdk\cmake, but you can configure your particular version from
externalNativeBuild {
cmake {
...
version "cmake-version"
}
}
And specify our custom CMake director as below inside local.properties
cmake.dir="path-to-cmake"
Or, you can choose NOT to upgrade your CMake from SDK Manager (just to delete the sdk\cmake\<version to delete> folder will be fine) so that you can stick to the CMake version your project is comfortable with.

Related

Android NDK - building native libraries without Android Studio

I'm working on a c/c++ cross-platform project, constructed of 2 main libraries (with a few external dependencies: ssl, yajl, fribidi).
The android solution will include Java files and a JNI layer, all bundled in a AAR file (including assets and the native libs).
I managed to build the whole project, but in a very awkward way:
I created a 'hello world' Android app', with native support, from within Android Studio, and added all native dependencies to the CMAkeList.txt. I added my Java code + JNI and managed to create the AAR (only for ARM, for now).
Now I need to separate the build of the different libraries, to their separate projects, respectively: libA, libB and C.aar.
How is it done without the IDE (and via command-line)?
There's the stand-alone NDK, the make_standalone_toolchain.py script, android.toolchain.cmake and other options, but none are documented or up-to-date. Most documentation still talks about the outdated Android.mk methodology.
I'd presume including android.toolchain.cmake in my CMakeList.txt, which will set all needed environment...
I'm using the newest Android Studio 3.0.1 and NDK r16b (installed via SDK Manager)
Alex - thanks, exactly what I was looking for. Just had to add a few flags and a call to make:
> cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK%\build\cmake\android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=android-19 -DCMAKE_MAKE_PROGRAM=%ANDROID_NDK%\prebuilt\windows-x86_64\bin\make.exe -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI="armeabi-v7a with NEON" ..
> cmake --build .
Android Studio (the standard Android gradle plugin, that is) does not support native-only modules, but you can split your CMake script and work with libA and libB separately. You can run cmake from command line (but better use the version that is shipped with Android SDK).
sdk/cmake/3.6.4111459/bin/cmake -DCMAKE_TOOLCHAIN_FILE=sdk/ndk-bundle/build/cmake/android.toolchain.cmake ...
The easiest way to build the AAR file that includes a compiled Java wrapper and the two native libraries would be with Android Studio, but you can run the gradle task from command line. This is what we typically do on a build server.

Android Studio Error Communicating With System CMake

I just created a trivial Android project with C++ support using Android Studio 3.0.1 on OS X High Sierra and I'm trying to figure out how to get CMake support.
I wasn't able to install CMake through Android Studio because there's an error with the project and the Tools > Android option is not available through the menu.
Here's what the project looks like:
For comparison, here's another trivial project without C++ support showing the Tools > Android option.
I read something about configuring Android Studio to use the system cmake. Apparently, you can override the cmake.dir setting in the project's local.properties file:
https://developer.android.com/studio/projects/add-native-code.html
excerpt:
Include the path to the CMake installation in your project's
local.properties file: cmake.dir="path-to-cmake"
So, I set the cmake.dir to /usr/local (because I already installed cmake previously through homebrew and changed the properties file)
It now reads (replacing ~ with your home directory)
# ... some comments warning you not to modify
# the properties file ...
ndk.dir=~/Library/Android/sdk/ndk-bundle
sdk.dir=~/Library/Android/sdk
cmake.dir="/usr/local"
Android Studio now shows the error message (newlines and \s inserted for legibility and home directory replaced with ~):
Error:Error occurred while communicating with CMake server.
Check log
~/AndroidStudioProjects/Cpptest/
\ app/.externalNativeBuild/cmake/
\ debug/armeabi-v7a/cmake_server_log.txt
for additional information.
However, the contents of that file suggest that the cmake binary did something reasonable in response to a command invoked by Android Studio.
CMAKE SERVER:-
CMAKE SERVER: [== "CMake Server" ==[
CMAKE SERVER: {"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":1}],"type":"hello"}
CMAKE SERVER: ]== "CMake Server" ==]
The system CMake is version 3.10.0 which is greater than 3.7 (I believe the minimum supported version).
How do I "convince" Android Studio to use the system CMake?
Is there a way to install a CMake distribution managed by the IDE if Tools > Android is not available?
If neither of those options seems straightforward, can I configure Android Studio to use a different build system for the C++ sources, like GNU Make or just plain gradle?
So, I still don't know why pointing Android Studio at the system CMake didn't work. I also tried installing a "full CMake" distribution through their website (https://cmake.org/download/) and pointing to /Applications/CMake.app/Contents/
However, it is possible to install CMake and lldb in a different way in Android Studio on OS X even if Tools > Android Does not appear.
And that is:
Preferences > Appearance & Behavior > System Settings > Android SDK > SDK Tools
Or, equivalently, Cmd , and then type sdk in the search field and then click the SDK Tools tab.
Here's a picture.
There was an issue in earlier versions of external CMake support where we didn't support future CMake server protocol versions. This has since been fixed. If you try a recent Android Studio 3.1 I think it should work.

Missing generated folders in Android Studio

I'm using Android Annotations in my project and I followed the instructions in this blog post http://www.jayway.com/2014/02/21/androidannotations-setup-in-android-studio/
Everything worked fine.
Today I updated Android Studio to latest version (build of 5th june). This requires an update of gradle build tools from 19.0.3 to 19.1.0. And i configured this in my build.gradle.
Annotaion processing still works. The generated files are located in build/source/apt. But this folder isn't visible any more in project explorer. And starting the build complains about the configuration.
But the project seems to run correctly.
This behavior is very annoying. Do I have to change anything in Android Studio? Has anyone a solution or is this just a bug in Android Studio?
The author of android-apt has already updated his plugin to support Gradle's new version, just change this line in your build.gradle
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+'
To
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.3'
The Android Studio Team changed the behavior of the IDE "for better IDE integration". Therefore the output directory of the apt-plugin v 1.2 will not be recognized as generated sources folder any more.
the plugin author knows about it and will provide a fix
https://bitbucket.org/hvisser/android-apt/issue/13/compatibility-with-011-android-plugin

How to import a android project into android studio?

I want to study the source code of android-smspopup .But when I download the source code and import this into android studio, the android studio pop up a dialog with a title"Import Gradle Project" and a blank to fill named Gradle home. Does any one know why this happens? And what to fill in Gradle home?
The source code doesn't include the Gradle wrapper files, which it should; the Gradle wrapper is responsible for automatically downloading the correct version of Gradle so you don't have to go through this trouble. I would recommend that you copy the Gradle wrapper over from another project into this source tree and use it. In another project that you've created with the New Project wizard, copy these files to the root directory of the project:
gradlew
gradlew.bat
gradle (directory)
When you open up the project in Android Studio it's likely to complain about the version of the Android Gradle plugin and offer to fix it for you; let it do that. If you're running the latest version of Android Studio (0.4.6 as of this writing), it's fairly smart about getting the versions of Gradle and the plug-in right, but in older versions it could get a little confused and have to ask you multiple times.
NOTE: instead of copying the wrapper files over, you can instead install a compatible version of Gradle and put the installation directory in when it asks for Gradle home. That will work, but be aware that Android Studio is very finicky about what version of Gradle it's compatible with; usually it requires a specific version that isn't forward-compatible, so for example, if it wants 1.10, 1.11 won't work. As you upgrade Android Studio you'll have to upgrade Gradle as well and it will be a bit of a drag; if you use the wrapper it's easier to make that change.
By the time Android Studio hits 1.0, it will sort out the version issues with Gradle, and it won't be so picky about version numbers, but in the short term, it's a limitation.

Cannot remove NDK support from Android project

I am unable to remove NDK support from my Android project. I have gone through all the workspace and project settings, including CDT builder, C/C++ build paths, etc. I have cleaned my workspace and relaunched Eclipse. However, my project will not build as Eclipse complains about this error:
Program "/home/eazyigz/adt-bundle-linux-x86/android-ndk-r8c/ndk-build" not found in PATH
I really don't know what to do, as I don't even have ndk-r8c downloaded, and it's an outdated version of ndk anyway! I am on Ubuntu Linux.
Anybody knows?
Well, I reinstalled Eclipse. Then I deleted my project and re-imported it into the workspace. Now I don't get that error anymore. Problem solved.
If you have a C/C++ aspect to your code which references the Android NDK plugin for Eclipse, you need to have the NDK location set in the NDK plugin preferences:

Resources