(I chose to create a new post for this to start from a clean sheet...)
=====================================================
Preliminary notes:
=====================================================
- This is definitely NOT the right way (nor the only one) to make it work, but I will leave that to the smart Juce/Roli engineers... Until they do it right, the purpose here is just to give a "manual" solution to be able to compile the Juce Demo project as produced by IntroJucer using Android Studio and run it on a Nexus 10 (Android 4.4.4 - API 19). A lot of what I've done here may obviously be optimized and automated.
- My dev setup is a Mac mini (MacOSX 10.10.3) with the latest android SDK (rev 24.2.0) and NDK (rev 10e), and of course Android Studio (1.2.1.1).
- I picked an arbitrary folder structure to put the source files (see below). This may be changed at your own risks. I would however recommend that you start with this one for testing purposes...
=====================================================
IntroJucer
=====================================================
Open JuceDemo.jucer
Set Modules folder
Copy modules locally
Set ndk and sdk paths:
/PathToYourDevTools/android-sdk-macosx
/PathToYourDevTools/android-ndk-r10e
Minimum SDK version: 19
Enable c++11flag
Architectures: armeabi-v7a
Save Project and Open in MacOSX
Run under XCode (Mac) just to make sure nothing is missing
=====================================================
Android Studio
=====================================================
Import Eclipse project from Builds/Android folder (leave all options checked) to a JuceDemo folder somewhere you like...
Copy JuceDemo/Source folder under app/src folder
Copy JuceLibraryCode folder under app folder
=====================================================
Modify paths in android.mk (note that this will be needed every time you save IntroJucer project unless you use a batch file to copy it before launching compile). This step consists only in modifying the "../" in the paths :
=====================================================
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) ifeq ($(TARGET_ARCH_ABI), armeabi-v7a) LOCAL_ARM_MODE := arm endif LOCAL_MODULE := juce_jni LOCAL_SRC_FILES := \ ../../Source/Main.cpp\ ../../Source/MainWindow.cpp\ ../../Source/IntroScreen.cpp\ ../../Source/Demos/AnimationDemo.cpp\ ../../Source/Demos/AudioLatencyDemo.cpp\ ../../Source/Demos/AudioPlaybackDemo.cpp\ ../../Source/Demos/AudioRecordingDemo.cpp\ ../../Source/Demos/AudioSettingsDemo.cpp\ ../../Source/Demos/AudioSynthesiserDemo.cpp\ ../../Source/Demos/Box2DDemo.cpp\ ../../Source/Demos/CameraDemo.cpp\ ../../Source/Demos/ChildProcessDemo.cpp\ ../../Source/Demos/CodeEditorDemo.cpp\ ../../Source/Demos/ComponentTransformsDemo.cpp\ ../../Source/Demos/CryptographyDemo.cpp\ ../../Source/Demos/DialogsDemo.cpp\ ../../Source/Demos/FontsDemo.cpp\ ../../Source/Demos/GraphicsDemo.cpp\ ../../Source/Demos/ImagesDemo.cpp\ ../../Source/Demos/JavaScript.cpp\ ../../Source/Demos/KeyMappingsDemo.cpp\ ../../Source/Demos/LiveConstantDemo.cpp\ ../../Source/Demos/LookAndFeelDemo.cpp\ ../../Source/Demos/MDIDemo.cpp\ ../../Source/Demos/MidiDemo.cpp\ ../../Source/Demos/MultithreadingDemo.cpp\ ../../Source/Demos/MultiTouch.cpp\ ../../Source/Demos/NetworkingDemo.cpp\ ../../Source/Demos/OpenGLDemo.cpp\ ../../Source/Demos/OpenGLDemo2D.cpp\ ../../Source/Demos/PropertiesDemo.cpp\ ../../Source/Demos/SystemInfoDemo.cpp\ ../../Source/Demos/TimersAndEventsDemo.cpp\ ../../Source/Demos/UnitTestsDemo.cpp\ ../../Source/Demos/ValueTreesDemo.cpp\ ../../Source/Demos/VideoDemo.cpp\ ../../Source/Demos/WebBrowserDemo.cpp\ ../../Source/Demos/WidgetsDemo.cpp\ ../../Source/Demos/WindowsDemo.cpp\ ../../Source/Demos/XMLandJSONDemo.cpp\ ../../../JuceLibraryCode/BinaryData.cpp\ ../../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp\ ../../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp\ ../../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp\ ../../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp\ ../../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.cpp\ ../../../JuceLibraryCode/modules/juce_box2d/juce_box2d.cpp\ ../../../JuceLibraryCode/modules/juce_core/juce_core.cpp\ ../../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.cpp\ ../../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp\ ../../../JuceLibraryCode/modules/juce_events/juce_events.cpp\ ../../../JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp\ ../../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp\ ../../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.cpp\ ../../../JuceLibraryCode/modules/juce_opengl/juce_opengl.cpp\ ../../../JuceLibraryCode/modules/juce_video/juce_video.cpp\ ifeq ($(NDK_DEBUG),1) LOCAL_CPPFLAGS += -fsigned-char -fexceptions -frtti -g -I "../../../JuceLibraryCode" -I "../../../JuceLibraryCode/modules" -O0 -std=c++11 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=19" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000" LOCAL_LDLIBS := -llog -lGLESv2 LOCAL_CFLAGS += -fsigned-char -fexceptions -frtti -g -I "../../../JuceLibraryCode" -I "../../../JuceLibraryCode/modules" -O0 -std=c++11 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=19" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000" LOCAL_LDLIBS := -llog -lGLESv2 else LOCAL_CPPFLAGS += -fsigned-char -fexceptions -frtti -I "../../../JuceLibraryCode" -I "../../../JuceLibraryCode/modules" -O3 -std=c++11 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=19" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "NDEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000" LOCAL_LDLIBS := -llog -lGLESv2 LOCAL_CFLAGS += -fsigned-char -fexceptions -frtti -I "../../../JuceLibraryCode" -I "../../../JuceLibraryCode/modules" -O3 -std=c++11 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=19" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "NDEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000" LOCAL_LDLIBS := -llog -lGLESv2 endif include $(BUILD_SHARED_LIBRARY)
=====================================================
Modify build.gradle
=====================================================
apply plugin: 'com.android.application' android { compileSdkVersion 19 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.juce.jucedemo" minSdkVersion 19 targetSdkVersion 19 ndk { moduleName "juce_jni" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } sourceSets.main { jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk } // call regular ndk-build(.cmd) script from app directory task ndkBuild(type: Exec) { commandLine '/PathToYourDevTools/android-ndk-r10e/ndk-build', '-C', file('/PathToYourAndroidStudioProjects/JuceDemo/app/src/main/jni') } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild } }
Tools/Android/Sync project with gradle file
Build/Re-build project
If no error (Build successful) :
Run...
Note that even the OpenGL demo works rather smoothly...
Please don't hesitate to add comments, in particular if you found easy shortcuts or details to make it work on other platforms (or on simulator).