I’m trying to create a project that has builds for both a windows DLL and an Android AAR
The project has a common code base using JUCE
but I can’t figure out a way to have single projucer for these
currently, I have them in seperate projucer projects (a windows DLL projucer and an android App projucer that I’ve hacked into a Shared Libray solution)
But this isn’t easy for code management.
Does anyone have any suggestions how I can manage to get them into a single solution?
The Projucer “Dynamic library” template doesn’t work as expected on Android? (I only have experience about that on Windows and macOs.)
I have JUCE Dynamic Library projects working on Android. They are architecture-specific .so
files, not AAR.
I also have an example JUCE Dynamic Library project that targets Android, Windows and Mac/iOS which I can send you if you wish.
that would be great Adam, muchly appreciated
Thanks for sharing your project. It starting to make sense!
One of the reasons I couldn’t combine the two libraries into a single projucer is that my hacky attempts to make an android library were to take a working GUI application and change the application to a library, e.g. apply plugin: 'com.android.library'
, and comment out //applicationId "com.acme.myapp"
while, in my host, setting the object to com.roli.juce.JuceApp
and calling the OnCreate
function on the currentActivity
of the host.
Now, when I change it to Dynamic Library in Projucer, the build doesn’t include com.roli.juce.JuceApp
, which obviously makes sense becaue its no longer a GUI App.
I tried then to create my own version of com.acme.JuceApp
(duplicating the code, with changes to package) – this works when my libray is hacked from the GUI App approach – but when I’m building a Dynamic Library this always results in assert error I/JUCE: JUCE Assertion failure in juce_android_Threads.cpp:321
which comes from the getAppContext()
method
// You did not call Thread::initialiseJUCE which must be called at least once in your apk
// before using any JUCE APIs. The Projucer will automatically generate java code
// which will invoke Thread::initialiseJUCE for you.
Any ideas what am I missing in my Dynamic Library that would solve this?
I just published the project on GitHub: https://github.com/adamski/audioengine-demo
It sounds like you might be missing the call to initialise JUCE. A handy way to do this is to use the ScopedJuceInitialiser_GUI
. See https://github.com/adamski/audioengine-demo/blob/dfc110ea349c86610f55823005889dcf615f38a8/DemoAudioEngine/Source/AndroidBindings.cpp#L29
Also you do not need (and should not have) a Custom Activity defined in Projucer, if creating a Dynamic Library. Your main Android app will contain the Activities.
1 Like
Yes, my main android app has the activity (probably not too clear above)
this is being used in a Unity3D App
AndroidJavaObject bridge = new AndroidJavaObject("com.acme.JuceApp");
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject act = jc.GetStatic<AndroidJavaObject>("currentActivity");
act.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
bridge.Call("onCreate");
}));
It seems so. I think one of my ongoing confusions is the same code (my code) works when I build a GUI App (that is hacked into a library) but not when I build a Library. So is projucer adding some code that does the initialisation in the App form that is missing when in the Lib?
If so, and it is the ScopedJuceInitialiser_GUI.
where should I include this?
You would include the ScopedJuceInitialiser_GUI
instance in a class that will remain alive for the lifetime of your app, or at least the JUCE part of it. I would recommend following the pattern in the linked project.
Thanks.
I got it to work following the pattern.
1 Like