The new Android Studio/Gradle exporter

We have re-worked the Android Studio/Gradle exporter in JUCE and removed the deprecated “Android Ant” exporter. The new exporter now supports cmake-based native code builds, parallel jobs during building, dynamic build configurations and the new “non-experimental” gradle plug-in.

The new exporter does not require symlinks to function. This means that creating the Android exporter on Windows will now work properly on network drives and without administrator permissions. In addition, the removal of symlinks makes it easier to include the Android Studio project in your git repository.

Furthermore, it’s now even easier to build your Android project from the command-line:

  1. Navigate to the Android build folder in your JUCE project
    cd JUCE/examples/Demo/Builds/Android
  2. The available gradle tasks depend on how you named your build configurations in the projucer. To get a list of available tasks type-in:
    ./gradlew tasks
    Gradle requires JAVA so - on OS X for example - you may see this dialog:

    If so, then you need to head to oracle.com and download the newest version of the JDK (for example from here). Re-run./gradlew tasks after installing.
    If you get an error similar to:
    The SDK directory '/Users/<username>/Library/Android/sdk' does not exist.
    then you need to install Android Studio and launch it once to run the Android Studio Setup Wizard. After this re-run ./gradlew tasks.
    Gradle may complain about missing platform SKDs, NDKs or Cmake. Launch the SDK manager in Android Studio to install the missing components.
  3. Attach an Android phone to your computer or launch an android emulator.
  4. Find a task that begins with install_<ConfigurationName>_<Debug/Release> and execute it. For example:
    ./gradlew installDebug_debug
  5. Launch the app on your phone or in the emulator
1 Like

finally no more symlinks hell! does this means that include paths for modules have been fixed too? had some problems with it…

will give it a spin for sure!

Yup this should work now as well.

Don’t know how I missed this. Thank you @fabian! I still hadn’t got round to checking your branch, but now I don’t need to keep that branch around as its officially available… great stuff, I will be checking this out when I get some more time to work on my Android project.

This will make working with Juce plus native Android and React Native much simpler!

1 Like

I’m able to build and install the installDebug_Debug task. However, I’m running into an error when I try to run the installRelease_Release task. I successfully make it through x86, x86_64, armeabi-v7a, and arm64-v8a. But it fails on armeabi. Main error message seems to be Error: selected processor does not support ARM mode.

Here’s the logs:

Starting process ‘command ‘/Users/hbursk/Library/Android/sdk/cmake/3.6.3155560/bin/cmake’’. Working directory: /Users/hbursk/Research/JUCE2/examples/Demo/Builds/Android/app Command: /Users/hbursk/Library/Android/sdk/cmake/3.6.3155560/bin/cmake --build /Users/hbursk/Research/JUCE2/examples/Demo/Builds/Android/app/.externalNativeBuild/cmake/release_Release/armeabi --target juce_jni
Successfully started process ‘command ‘/Users/hbursk/Library/Android/sdk/cmake/3.6.3155560/bin/cmake’’
[1/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Main.cpp.o
[2/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/MainWindow.cpp.o
[3/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/IntroScreen.cpp.o
[4/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AnimationDemo.cpp.o
[5/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioLatencyDemo.cpp.o
[6/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioPlaybackDemo.cpp.o
[7/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioRecordingDemo.cpp.o
[8/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioSettingsDemo.cpp.o
[9/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp.o
[10/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/Box2DDemo.cpp.o
[11/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/CameraDemo.cpp.o
[12/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ChildProcessDemo.cpp.o
[13/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/CodeEditorDemo.cpp.o
[14/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ComponentTransformsDemo.cpp.o
[15/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/CryptographyDemo.cpp.o
[16/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/DialogsDemo.cpp.o
[17/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/FlexBoxDemo.cpp.o
[18/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/FontsDemo.cpp.o
[19/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/GraphicsDemo.cpp.o
[20/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ImagesDemo.cpp.o
[21/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/JavaScript.cpp.o
[22/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/KeyMappingsDemo.cpp.o
[23/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/LiveConstantDemo.cpp.o
[24/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/LookAndFeelDemo.cpp.o
[25/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MDIDemo.cpp.o
[26/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MidiDemo.cpp.o
[27/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MultithreadingDemo.cpp.o
[28/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MultiTouch.cpp.o
[29/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/NetworkingDemo.cpp.o
[30/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/OpenGLDemo.cpp.o
[31/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/OpenGLDemo2D.cpp.o
[32/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/PropertiesDemo.cpp.o
[33/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/SystemInfoDemo.cpp.o
[34/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/TimersAndEventsDemo.cpp.o
[35/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/UnitTestsDemo.cpp.o
[36/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ValueTreesDemo.cpp.o
[37/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/VideoDemo.cpp.o
[38/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/WebBrowserDemo.cpp.o
[39/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/WidgetsDemo.cpp.o
[40/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/WindowsDemo.cpp.o
[41/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/XMLandJSONDemo.cpp.o
[42/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/BinaryData.cpp.o
[43/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_basics.cpp.o
[44/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_devices.cpp.o
[45/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o
[46/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_processors.cpp.o
[47/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o
[48/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_box2d.cpp.o
[49/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_core.cpp.o
[50/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_cryptography.cpp.o
[51/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_data_structures.cpp.o
[52/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_events.cpp.o
[53/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_graphics.cpp.o
[54/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_gui_basics.cpp.o
[55/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_gui_extra.cpp.o
[56/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_opengl.cpp.o
FAILED: /Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/hbursk/Library/Android/sdk/ndk-bundle/platforms/android-24/arch-arm -DJUCE_ANDROID=1 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_yourcompany_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH="com/yourcompany/jucedemo/JuceDemo" -DJUCE_ANDROID_API_VERSION=24 -DJUCE_ANDROID_GL_ES_VERSION_3_0=1 -DJUCE_UNIT_TESTS=1 -DNDEBUG=1 -Djuce_jni_EXPORTS -I…/…/…/…/…/…/…/JuceLibraryCode -I…/…/…/…/…/…/…/…/…/modules -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/android/support/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++abi/include -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -fsigned-char -std=gnu++11 -O3 -Os -DNDEBUG -Os -DNDEBUG -fPIC -MD -MT CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o -MF CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o.d -o CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o -c /Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp
/var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_utils-b00354.s: Assembler messages:
/var/folders
/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_utils-b00354.s:12126: Error: selected processor does not support ARM mode ssat r6,#8,r0' /var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_utils-b00354.s:12150: Error: selected processor does not support ARM mode ssat r0,#8,r0’
clang++: error: assembler command failed with exit code 1 (use -v to see invocation)
FAILED: /Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/hbursk/Library/Android/sdk/ndk-bundle/platforms/android-24/arch-arm -DJUCE_ANDROID=1 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_yourcompany_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH="com/yourcompany/jucedemo/JuceDemo" -DJUCE_ANDROID_API_VERSION=24 -DJUCE_ANDROID_GL_ES_VERSION_3_0=1 -DJUCE_UNIT_TESTS=1 -DNDEBUG=1 -Djuce_jni_EXPORTS -I…/…/…/…/…/…/…/JuceLibraryCode -I…/…/…/…/…/…/…/…/…/modules -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/android/support/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++abi/include -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -fsigned-char -std=gnu++11 -O3 -Os -DNDEBUG -Os -DNDEBUG -fPIC -MD -MT CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o -MF CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o.d -o CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o -c /Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp
/var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_formats-b64487.s: Assembler messages:
/v
ar/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_formats-b64487.s:154174: Error: selected processor does not support ARM mode `ssat r0,#8,r0’
clang++: error: assembler command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
:app:externalNativeBuildRelease_Release FAILED
:app:externalNativeBuildRelease_Release (Thread[Daemon worker Thread 8,5,main]) completed. Took 6 mins 7.734 secs.

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ‘:app:externalNativeBuildRelease_Release’.

Build command failed.
Error while executing process /Users/hbursk/Library/Android/sdk/cmake/3.6.3155560/bin/cmake with arguments {–build /Users/hbursk/Research/JUCE2/examples/Demo/Builds/Android/app/.externalNativeBuild/cmake/release_Release/armeabi --target juce_jni}
[1/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Main.cpp.o
[2/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/MainWindow.cpp.o
[3/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/IntroScreen.cpp.o
[4/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AnimationDemo.cpp.o
[5/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioLatencyDemo.cpp.o
[6/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioPlaybackDemo.cpp.o
[7/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioRecordingDemo.cpp.o
[8/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioSettingsDemo.cpp.o
[9/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp.o
[10/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/Box2DDemo.cpp.o
[11/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/CameraDemo.cpp.o
[12/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ChildProcessDemo.cpp.o
[13/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/CodeEditorDemo.cpp.o
[14/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ComponentTransformsDemo.cpp.o
[15/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/CryptographyDemo.cpp.o
[16/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/DialogsDemo.cpp.o
[17/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/FlexBoxDemo.cpp.o
[18/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/FontsDemo.cpp.o
[19/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/GraphicsDemo.cpp.o
[20/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ImagesDemo.cpp.o
[21/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/JavaScript.cpp.o
[22/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/KeyMappingsDemo.cpp.o
[23/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/LiveConstantDemo.cpp.o
[24/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/LookAndFeelDemo.cpp.o
[25/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MDIDemo.cpp.o
[26/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MidiDemo.cpp.o
[27/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MultithreadingDemo.cpp.o
[28/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/MultiTouch.cpp.o
[29/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/NetworkingDemo.cpp.o
[30/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/OpenGLDemo.cpp.o
[31/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/OpenGLDemo2D.cpp.o
[32/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/PropertiesDemo.cpp.o
[33/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/SystemInfoDemo.cpp.o
[34/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/TimersAndEventsDemo.cpp.o
[35/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/UnitTestsDemo.cpp.o
[36/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/ValueTreesDemo.cpp.o
[37/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/VideoDemo.cpp.o
[38/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/WebBrowserDemo.cpp.o
[39/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/WidgetsDemo.cpp.o
[40/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/WindowsDemo.cpp.o
[41/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/Source/Demos/XMLandJSONDemo.cpp.o
[42/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/BinaryData.cpp.o
[43/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_basics.cpp.o
[44/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_devices.cpp.o
[45/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o
[46/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_processors.cpp.o
[47/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o
[48/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_box2d.cpp.o
[49/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_core.cpp.o
[50/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_cryptography.cpp.o
[51/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_data_structures.cpp.o
[52/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_events.cpp.o
[53/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_graphics.cpp.o
[54/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_gui_basics.cpp.o
[55/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_gui_extra.cpp.o
[56/58] Building CXX object CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_opengl.cpp.o
FAILED: /Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/hbursk/Library/Android/sdk/ndk-bundle/platforms/android-24/arch-arm -DJUCE_ANDROID=1 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_yourcompany_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH="com/yourcompany/jucedemo/JuceDemo" -DJUCE_ANDROID_API_VERSION=24 -DJUCE_ANDROID_GL_ES_VERSION_3_0=1 -DJUCE_UNIT_TESTS=1 -DNDEBUG=1 -Djuce_jni_EXPORTS -I…/…/…/…/…/…/…/JuceLibraryCode -I…/…/…/…/…/…/…/…/…/modules -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/android/support/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++abi/include -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -fsigned-char -std=gnu++11 -O3 -Os -DNDEBUG -Os -DNDEBUG -fPIC -MD -MT CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o -MF CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o.d -o CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp.o -c /Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_utils.cpp
/var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_utils-b00354.s: Assembler messages:
/var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_utils-b00354.s:12126: Error: selected processor does not support ARM mode ssat r6,#8,r0' /var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_utils-b00354.s:12150: Error: selected processor does not support ARM mode ssat r0,#8,r0’
clang++: error: assembler command failed with exit code 1 (use -v to see invocation)
FAILED: /Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/hbursk/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/hbursk/Library/Android/sdk/ndk-bundle/platforms/android-24/arch-arm -DJUCE_ANDROID=1 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_yourcompany_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH="com/yourcompany/jucedemo/JuceDemo" -DJUCE_ANDROID_API_VERSION=24 -DJUCE_ANDROID_GL_ES_VERSION_3_0=1 -DJUCE_UNIT_TESTS=1 -DNDEBUG=1 -Djuce_jni_EXPORTS -I…/…/…/…/…/…/…/JuceLibraryCode -I…/…/…/…/…/…/…/…/…/modules -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/android/support/include -isystem /Users/hbursk/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++abi/include -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -marm -Wa,–noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -frtti -fsigned-char -std=gnu++11 -O3 -Os -DNDEBUG -Os -DNDEBUG -fPIC -MD -MT CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o -MF CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o.d -o CMakeFiles/juce_jni.dir/Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp.o -c /Users/hbursk/Research/JUCE2/examples/Demo/JuceLibraryCode/juce_audio_formats.cpp
/var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_formats-b64487.s: Assembler messages:
/var/folders/bc/_tchcddn11bbk684q2h5b_lsdjb9k1/T/juce_audio_formats-b64487.s:154174: Error: selected processor does not support ARM mode `ssat r0,#8,r0’
clang++: error: assembler command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

Ouch! This worked last week. I think the ndk update that was released a few days ago broke the armeabi build. I’ll investigate…

1 Like

After further investigation, I can see that this error only shows up with the latest ndk update. Unfortunately, it’s nearly impossible to downgrade the ndk version. I’m trying to file a bug, but I’m struggling to reproduce the problem in a simple .cpp file.

In any case, for now, you can use the following workaround:
a) patch JUCE/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp:44

diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp b/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp
index 45f0820..ad8c918 100644
--- a/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp
+++ b/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp
@@ -41,8 +41,10 @@ struct AudioThumbnail::MinMaxValue

	 inline void setFloat (Range<float> newRange) noexcept
	 {
-        values[0] = (int8) jlimit (-128, 127, roundFloatToInt (newRange.getStart() * 127.0f));
-        values[1] = (int8) jlimit (-128, 127, roundFloatToInt (newRange.getEnd()   * 127.0f));
+        Range<float> limitedRange (jlimit (-1.0f, 1.0f, newRange.getStart()),
+                                   jlimit (-1.0f, 1.0f, newRange.getEnd()));
+        values[0] = (int8) (limitedRange.getStart() * 127.0f);
+        values[1] = (int8) (limitedRange.getEnd()   * 127.0f);

		 if (values[0] == values[1])
		 {

b) Disable ogg/vorbis audio format encoder/decoder:

1 Like

OK I’ve now added some dirty workarounds for the armeabi internal compiler bug on the develop branch.