In my Android project, I implemented JUCE as a C++ library.
I managed to implement everything, but when I try to compile my app, I get the following error:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:buildCMakeDebug[armeabi-v7a]'.
> com.android.ide.common.process.ProcessException: ninja: Entering directory `/Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/android/app/.cxx/Debug/5m4z36ud/armeabi-v7a'
[1/1] Linking CXX shared library /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/5m4z36ud/obj/armeabi-v7a/libnative-lib.so
FAILED: /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/5m4z36ud/obj/armeabi-v7a/libnative-lib.so
: && /Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi16 --sysroot=/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fexceptions -frtti -stdlib=libc++ -g -fno-limit-debug-info -Ofast -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Qunused-arguments -Wl,--no-undefined -shared -Wl,-soname,libnative-lib.so -o /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/5m4z36ud/obj/armeabi-v7a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o CMakeFiles/native-lib.dir/src/main/cpp/PlayAudioEngine.cpp.o ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a libcpufeatures.a oboe/liboboe.a /Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/16/liblog.so -llog -lOpenSLES -latomic -lm && :
ld: error: undefined symbol: __strlen_chk
>>> referenced by string.h:227 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:227)
>>> include_juce_core.cpp.o:(juce::logAssertion(char const*, int)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by string.h:227 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:227)
>>> include_juce_core.cpp.o:(juce::File::getChildFile(juce::StringRef) const) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by string.h:227 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:227)
>>> include_juce_core.cpp.o:(juce::String::endsWithChar(wchar_t) const) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced 174 more times
ld: error: undefined symbol: __open_2
>>> referenced by fcntl.h:67 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/fcntl.h:67)
>>> include_juce_core.cpp.o:(juce::MemoryMappedFile::openInternal(juce::File const&, juce::MemoryMappedFile::AccessMode, bool)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by fcntl.h:67 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/fcntl.h:67)
>>> include_juce_core.cpp.o:(juce::FileInputStream::FileInputStream(juce::File const&)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by fcntl.h:67 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/fcntl.h:67)
>>> include_juce_core.cpp.o:(juce::FileInputStream::openHandle()) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced 6 more times
ld: error: undefined symbol: __read_chk
>>> referenced by unistd.h:191 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/unistd.h:191)
>>> include_juce_core.cpp.o:(juce::FileInputStream::readInternal(void*, unsigned int)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by unistd.h:191 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/unistd.h:191)
>>> include_juce_core.cpp.o:(juce::NamedPipe::Pimpl::read(char*, int, int)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
ld: error: undefined symbol: mkfifo
>>> referenced by juce_posix_NamedPipe.cpp:130 (/Users/mregnauld/JUCE/modules/juce_core/native/juce_posix_NamedPipe.cpp:130)
>>> include_juce_core.cpp.o:(juce::NamedPipe::openInternal(juce::String const&, bool, bool)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by juce_posix_NamedPipe.cpp:130 (/Users/mregnauld/JUCE/modules/juce_core/native/juce_posix_NamedPipe.cpp:130)
>>> include_juce_core.cpp.o:(juce::NamedPipe::openInternal(juce::String const&, bool, bool)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
ld: error: undefined symbol: signal
>>> referenced by juce_SystemStats.cpp:222 (/Users/mregnauld/JUCE/modules/juce_core/system/juce_SystemStats.cpp:222)
>>> include_juce_core.cpp.o:(juce::SystemStats::setApplicationCrashHandler(void (*)(void*))) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by juce_SystemStats.cpp:222 (/Users/mregnauld/JUCE/modules/juce_core/system/juce_SystemStats.cpp:222)
>>> include_juce_core.cpp.o:(juce::SystemStats::setApplicationCrashHandler(void (*)(void*))) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced by juce_SystemStats.cpp:222 (/Users/mregnauld/JUCE/modules/juce_core/system/juce_SystemStats.cpp:222)
>>> include_juce_core.cpp.o:(juce::SystemStats::setApplicationCrashHandler(void (*)(void*))) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
>>> referenced 4 more times
ld: error: undefined symbol: __vsnprintf_chk
>>> referenced by stdio.h:52 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/stdio.h:52)
>>> include_juce_core.cpp.o:(juce::String::formattedRaw(char const*, ...)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
ld: error: undefined symbol: __memcpy_chk
>>> referenced by string.h:60 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:60)
>>> include_juce_events.cpp.o:(juce::Timer::TimerThread::TimerThread()) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
C++ build system [build] failed while executing:
/Users/mregnauld/AndroidSDK/cmake/3.22.1/bin/ninja \
-C \
/Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/android/app/.cxx/Debug/5m4z36ud/armeabi-v7a \
native-lib
from /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/android/app
In Android Studio, I updated NDK and CMake, but I still get that error.
And for your information, here is my CMakeLists.txt file (the one of my app):
cmake_minimum_required(VERSION 3.18.1)
project(JUCEAudioDemo)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Ofast")
set(CMAKE_CXX_STANDARD 17)
# Oboe
set(OBOE_DIR "${CMAKE_SOURCE_DIR}/../../../../../JUCE/modules/juce_audio_devices/native/oboe")
add_subdirectory(${OBOE_DIR} ./oboe)
# CPU Features
add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")
# JUCE
set(JuceAudio_DIR ${CMAKE_SOURCE_DIR}/src/main/cpp/juceaudio)
add_library(JuceAudio STATIC IMPORTED)
set_property(TARGET JuceAudio PROPERTY IMPORTED_LOCATION
${JuceAudio_DIR}/lib/${ANDROID_ABI}/libjuceaudio.a)
set_target_properties(JuceAudio PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
${JuceAudio_DIR}/lib/include)
include_directories(${JuceAudio_DIR}/lib/include)
include_directories(${CMAKE_SOURCE_DIR}/../../../../../JUCE/modules)
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp
src/main/cpp/PlayAudioEngine.cpp
)
find_library(
log-lib
log)
target_link_libraries(
native-lib
JuceAudio
"cpufeatures"
"oboe"
${log-lib})
I really don’t know where to start, so any idea is very welcomed!
Thanks.