Using Projucer, I created a very basic library for Android, so I can play audio in a third party Android app (actually a Flutter app).
I initiate my player like the following:
AudioSamplePlayer::AudioSamplePlayer()
{
player = std::make_unique<juce::AudioSourcePlayer>();
player->setSource(this);
deviceManager.addAudioCallback(player.get());
}
When I want to start playing audio, I call the following function of my library, from my app:
void AudioSamplePlayer::demarrer()
{
deviceManager.initialiseWithDefaultDevices(0, 2);
}
But calling that function crashes my app, with the following stacktrace (I trunked it to keep it somehow readable):
I/JUCE (10402): JUCE Assertion failure in juce_android_Threads.cpp:320
F/jay.wezeejayla(10402): java_vm_ext.cc:594] JNI DETECTED ERROR IN APPLICATION: jmethodID was NULL
F/jay.wezeejayla(10402): java_vm_ext.cc:594] in call to CallObjectMethodV
F/jay.wezeejayla(10402): java_vm_ext.cc:594] from void com.wezeejay.wezeejaylab.service.lecteur.managers.LecteurAudioManager.nativePlay(long, boolean)
F/jay.wezeejayla(10402): runtime.cc:675] Runtime aborting...
F/jay.wezeejayla(10402): runtime.cc:675] Dumping all threads without mutator lock held
F/jay.wezeejayla(10402): runtime.cc:675] All threads:
F/jay.wezeejayla(10402): runtime.cc:675] DALVIK THREADS (27):
F/jay.wezeejayla(10402): runtime.cc:675] "main" prio=10 tid=1 Runnable
F/jay.wezeejayla(10402): runtime.cc:675] | group="" sCount=0 ucsCount=0 flags=0 obj=0x736b1318 self=0xb400007b5acee2c0
F/jay.wezeejayla(10402): runtime.cc:675] | sysTid=10402 nice=-10 cgrp=default sched=0/0 handle=0x7c9d30f500
F/jay.wezeejayla(10402): runtime.cc:675] | state=R schedstat=( 941114858 94427503 654 ) utm=75 stm=18 core=7 HZ=100
F/jay.wezeejayla(10402): runtime.cc:675] | stack=0x7fe0fd3000-0x7fe0fd5000 stackSize=8188KB
F/jay.wezeejayla(10402): runtime.cc:675] | held mutexes= "abort lock" "mutator lock"(shared held)
F/jay.wezeejayla(10402): runtime.cc:675] native: #00 pc 00000000005376cc /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+128) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #01 pc 00000000006f0e24 /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+236) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #02 pc 00000000006fe6b0 /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+208) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #03 pc 0000000000364174 /apex/com.android.art/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+440) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #04 pc 00000000006fce50 /apex/com.android.art/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool)+280) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #05 pc 00000000006d7ec4 /apex/com.android.art/lib64/libart.so (art::AbortState::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+212) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #06 pc 00000000006d2b24 /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+1016) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #07 pc 0000000000016ea8 /apex/com.android.art/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_3::__invoke(char const*)+80) (BuildId: b77c57f68a484ed93d5a7eda59d83bf9)
F/jay.wezeejayla(10402): runtime.cc:675] native: #08 pc 0000000000016450 /apex/com.android.art/lib64/libbase.so (android::base::LogMessage::~LogMessage()+352) (BuildId: b77c57f68a484ed93d5a7eda59d83bf9)
F/jay.wezeejayla(10402): runtime.cc:675] native: #09 pc 0000000000445224 /apex/com.android.art/lib64/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+1612) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #10 pc 0000000000329258 /apex/com.android.art/lib64/libart.so (art::JavaVMExt::JniAbortV(char const*, char const*, std::__va_list)+108) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #11 pc 000000000048d59c /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::AbortF(char const*, ...) (.__uniq.99033978352804627313491551960229047428)+144) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #12 pc 0000000000476624 /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::CheckMethodID(_jmethodID*) (.__uniq.99033978352804627313491551960229047428)+396) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #13 pc 0000000000452e98 /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::ScopedCheck::Check(art::ScopedObjectAccess&, bool, char const*, art::(anonymous namespace)::JniValueType*) (.__uniq.99033978352804627313491551960229047428)+1520) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #14 pc 0000000000475e2c /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CheckCallArgs(art::ScopedObjectAccess&, art::(anonymous namespace)::ScopedCheck&, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, art::InvokeType, art::(anonymous namespace)::VarArgs const*) (.__uniq.99033978352804627313491551960229047428)+76) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #15 pc 0000000000474d4c /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CallMethodV(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, std::__va_list, art::Primitive::Type, art::InvokeType) (.__uniq.99033978352804627313491551960229047428)+268) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #16 pc 0000000000474c18 /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CallObjectMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list) (.__uniq.99033978352804627313491551960229047428.llvm.5591279935177935698)+72) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #17 pc 0000000000136b28 /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (_JNIEnv::CallObjectMethod(_jobject*, _jmethodID*, ...)+116) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #18 pc 00000000002148d0 /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (juce::audioManagerGetProperty(juce::String const&)+268) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #19 pc 0000000000137e1c /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (juce::OboeAudioIODevice::getDefaultSampleRates()+164) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #20 pc 00000000001373e4 /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (juce::OboeAudioIODeviceType::checkAvailableDevices()+48) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #21 pc 000000000012f624 /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (juce::OboeAudioIODeviceType::OboeAudioIODeviceType()+136) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #22 pc 000000000012a690 /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (juce::AudioDeviceManager::createAudioDeviceTypes(juce::OwnedArray<juce::AudioIODeviceType, juce::DummyCriticalSection>&)+48) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #23 pc 00000000001286d0 /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (juce::AudioDeviceManager::createDeviceTypesIfNeeded()+60) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #24 pc 000000000012c0ac /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (juce::AudioDeviceManager::initialiseWithDefaultDevices(int, int)+108) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #25 pc 000000000012557c /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (wzj::AudioSamplePlayer::demarrer()+196) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #26 pc 00000000001151c4 /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/lib/arm64/libnative-lib.so (PlayAudioEngine::play(bool)+40) (BuildId: 75405f13fdb3c906e06fabc8f00faa9c800ae5d3)
F/jay.wezeejayla(10402): runtime.cc:675] native: #27 pc 0000000000440554 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #28 pc 0000000000209a9c /apex/com.android.art/lib64/libart.so (nterp_helper+1948) (BuildId: 56e704c544e6c624201be2ab4933e853)
F/jay.wezeejayla(10402): runtime.cc:675] native: #29 pc 0000000000006f88 [anon:dalvik-classes9.dex extracted in memory from /data/app/~~a2806_SuK8pzz5laqn1F8Q==/com.wezeejay.wezeejaylab-u41GDyUIXqgwZX_n7DqTrg==/base.apk!classes9.dex] (com.wezeejay.wezeejaylab.service.lecteur.managers.LecteurAudioManager.access$nativePlay)
F/jay.wezeejayla(10402): runtime.cc:675] native: #30 pc 0000000000209334 /apex/com.android.art/lib64/libart.so (nterp_helper+52) (BuildId: 56e704c544e6c624201be2ab4933e853)
I’m not sure at all, but it looks like the JUCE framework wants to call some functions from the Android SDK, in order to get the sample rate and the buffer size of the device.
So I modified my function like this, to test on my Android device (where I already know its sample rate and buffer size, so I hardcoded them for testing purposes):
void AudioSamplePlayer::demarrer()
{
auto deviceSetup = deviceManager.getAudioDeviceSetup();
deviceSetup.sampleRate = 48000;
deviceSetup.bufferSize = 192;
deviceSetup.inputChannels = 0;
deviceSetup.outputChannels = 2;
deviceSetup.useDefaultInputChannels = true;
deviceSetup.useDefaultOutputChannels = true;
deviceManager.setAudioDeviceSetup(deviceSetup, true);
deviceManager.initialiseWithDefaultDevices(0, 2);
}
But still the same error.
How can I fix that?
Thanks.