diff --git a/release/libs/android/arm64-v8a/libraylib.a b/release/libs/android/arm64-v8a/libraylib.a index 100abf648..915085f7e 100644 Binary files a/release/libs/android/arm64-v8a/libraylib.a and b/release/libs/android/arm64-v8a/libraylib.a differ diff --git a/release/libs/android/arm64-v8a/libraylib.so b/release/libs/android/arm64-v8a/libraylib.so index 5f46683b1..12de93157 100644 Binary files a/release/libs/android/arm64-v8a/libraylib.so and b/release/libs/android/arm64-v8a/libraylib.so differ diff --git a/release/libs/android/armeabi-v7a/libraylib.a b/release/libs/android/armeabi-v7a/libraylib.a new file mode 100644 index 000000000..85bb289b3 Binary files /dev/null and b/release/libs/android/armeabi-v7a/libraylib.a differ diff --git a/release/libs/android/armeabi-v7a/libraylib.so b/release/libs/android/armeabi-v7a/libraylib.so new file mode 100644 index 000000000..080996e7f Binary files /dev/null and b/release/libs/android/armeabi-v7a/libraylib.so differ diff --git a/src/Makefile b/src/Makefile index d3024df21..e1e66dd5a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -99,38 +99,41 @@ endif # user, "whoami" prints "root"). ROOT = $(shell whoami) +# By default we suppose we are working on Windows +HOST_PLATFORM_OS ?= WINDOWS + # Determine PLATFORM_OS in case PLATFORM_DESKTOP selected ifeq ($(PLATFORM),PLATFORM_DESKTOP) # No uname.exe on MinGW!, but OS=Windows_NT on Windows! # ifeq ($(UNAME),Msys) -> Windows ifeq ($(OS),Windows_NT) - PLATFORM_OS=WINDOWS + PLATFORM_OS = WINDOWS else - UNAMEOS=$(shell uname) + UNAMEOS = $(shell uname) ifeq ($(UNAMEOS),Linux) - PLATFORM_OS=LINUX + PLATFORM_OS = LINUX endif ifeq ($(UNAMEOS),FreeBSD) - PLATFORM_OS=BSD + PLATFORM_OS = BSD endif ifeq ($(UNAMEOS),OpenBSD) - PLATFORM_OS=BSD + PLATFORM_OS = BSD endif ifeq ($(UNAMEOS),NetBSD) - PLATFORM_OS=BSD + PLATFORM_OS = BSD endif ifeq ($(UNAMEOS),DragonFly) - PLATFORM_OS=BSD + PLATFORM_OS = BSD endif ifeq ($(UNAMEOS),Darwin) - PLATFORM_OS=OSX + PLATFORM_OS = OSX endif endif endif ifeq ($(PLATFORM),PLATFORM_RPI) - UNAMEOS=$(shell uname) + UNAMEOS = $(shell uname) ifeq ($(UNAMEOS),Linux) - PLATFORM_OS=LINUX + PLATFORM_OS = LINUX endif endif @@ -160,19 +163,20 @@ endif ifeq ($(PLATFORM),PLATFORM_WEB) # Emscripten required variables - EMSDK_PATH = C:/emsdk - EMSCRIPTEN_VERSION = 1.37.28 - CLANG_VERSION=e1.37.28_64bit - PYTHON_VERSION=2.7.5.3_64bit - NODE_VERSION=4.1.1_64bit - export PATH=$(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH) - EMSCRIPTEN=$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION) + EMSDK_PATH = C:/emsdk + EMSCRIPTEN_VERSION = 1.38.8 + CLANG_VERSION = e1.38.8_64bit + PYTHON_VERSION = 2.7.13.1_64bit\python-2.7.13.amd64 + NODE_VERSION = 8.9.1_64bit + export PATH = $(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH) + EMSCRIPTEN = $(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION) endif ifeq ($(PLATFORM),PLATFORM_ANDROID) # Android architecture: ARM64 # Starting at 2019 using ARM64 is mandatory for published apps - ANDROID_ARCH ?= ARM64 + ANDROID_ARCH ?= ARM + ANDROID_API_VERSION = 21 # Android required path variables # NOTE: Android NDK is just required to generate the standalone toolchain, @@ -180,11 +184,13 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) ANDROID_NDK = C:/android-ndk # Android standalone toolchain path - ifeq ($(ANDROID_ARCH),ARM64) - ANDROID_TOOLCHAIN = C:/android_toolchain_arm64_api21 - endif + ANDROID_TOOLCHAIN = C:/android_toolchain_$(ANDROID_ARCH)_API$(ANDROID_API_VERSION) + ifeq ($(ANDROID_ARCH),ARM) - ANDROID_TOOLCHAIN = C:/android_toolchain_arm_api21 + ANDROID_ARCH_NAME = armeabi-v7a + endif + ifeq ($(ANDROID_ARCH),ARM64) + ANDROID_ARCH_NAME = arm64-v8a endif endif @@ -214,12 +220,7 @@ ifeq ($(PLATFORM),PLATFORM_WEB) RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/html5 endif ifeq ($(PLATFORM),PLATFORM_ANDROID) - ifeq ($(ANDROID_ARCH),ARM64) - RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/android/arm64-v8a - endif - ifeq ($(ANDROID_ARCH),ARM) - RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/android/armeabi-v7a - endif + RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/android/$(ANDROID_ARCH_NAME) endif # Define raylib graphics api depending on selected platform @@ -272,14 +273,14 @@ ifeq ($(PLATFORM),PLATFORM_WEB) endif ifeq ($(PLATFORM),PLATFORM_ANDROID) # Android toolchain (must be provided for desired architecture and compiler) - ifeq ($(ANDROID_ARCH),ARM64) - CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang - AR = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-ar - endif ifeq ($(ANDROID_ARCH),ARM) CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-clang AR = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-ar endif + ifeq ($(ANDROID_ARCH),ARM64) + CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang + AR = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-ar + endif endif @@ -318,20 +319,20 @@ ifeq ($(PLATFORM),PLATFORM_WEB) CFLAGS += -s USE_GLFW=3 -s ASSERTIONS=1 --profiling endif ifeq ($(PLATFORM),PLATFORM_ANDROID) - # Compiler flags for arquitecture (only ARM, not ARM64) - ifeq ($(ANDROID_ARCH),ARM64) - CFLAGS += -target aarch64 -mfix-cortex-a53-835769 - endif + # Compiler flags for arquitecture ifeq ($(ANDROID_ARCH),ARM) CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 endif + ifeq ($(ANDROID_ARCH),ARM64) + CFLAGS += -target aarch64 -mfix-cortex-a53-835769 + endif # Compilation functions attributes options CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIE -fPIC # Compiler options for the linker # -Werror=format-security CFLAGS += -Wa,--noexecstack -Wformat -no-canonical-prefixes # Preprocessor macro definitions - CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=21 -DMAL_NO_OSS + CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=$(ANDROID_API_VERSION) -DMAL_NO_OSS endif # Define required compilation flags for raylib SHARED lib @@ -399,7 +400,7 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID) # Avoid unresolved symbol pointing to external main() LDFLAGS += -Wl,-undefined,dynamic_lookup - LDLIBS = -llog -landroid -lEGL -lGLESv2 -lOpenSLES -latomic -lc -lm + LDLIBS = -llog -landroid -lEGL -lGLESv2 -lOpenSLES -lc -lm endif # Define all object files required with a wildcard @@ -439,14 +440,23 @@ endif all: raylib # Generate standalone Android toolchain -# NOTE: Android toolchain could already be provided +# NOTE: If the host system is Windows or Linux, generation is different generate_android_toolchain: -ifeq ($(PLATFORM),PLATFORM_ANDROID) - ifeq ($(ANDROID_ARCH),ARM64) - $(ANDROID_NDK)/build/tools/make-standalone-toolchain.sh --platform=android-21 --toolchain=aarch64-linux-androideabi-4.9 --use-llvm --install-dir=$(ANDROID_TOOLCHAIN) - endif +ifeq ($(PLATFORM_OS),WINDOWS) + # NOTE: python should be available in the path ifeq ($(ANDROID_ARCH),ARM) - $(ANDROID_NDK)/build/tools/make-standalone-toolchain.sh --platform=android-21 --toolchain=arm-linux-androideabi-4.9 --use-llvm --install-dir=$(ANDROID_TOOLCHAIN) + $(ANDROID_NDK)/build/tools/python make_standalone_toolchain.py --arch arm --api $(ANDROID_API_VERSION) --install-dir $(ANDROID_TOOLCHAIN) + endif + ifeq ($(ANDROID_ARCH),ARM64) + $(ANDROID_NDK)/build/tools/python make_standalone_toolchain.py --arch arm64 --api $(ANDROID_API_VERSION) --install-dir $(ANDROID_TOOLCHAIN) + endif +endif +ifeq ($(PLATFORM_OS),LINUX) + ifeq ($(ANDROID_ARCH),ARM) + $(ANDROID_NDK)/build/tools/make-standalone-toolchain.sh --platform=android-$(ANDROID_API_VERSION) --toolchain=arm-linux-androideabi-4.9 --use-llvm --install-dir=$(ANDROID_TOOLCHAIN) + endif + ifeq ($(ANDROID_ARCH),ARM64) + $(ANDROID_NDK)/build/tools/make-standalone-toolchain.sh --platform=android-$(ANDROID_API_VERSION) --toolchain=aarch64-linux-androideabi-4.9 --use-llvm --install-dir=$(ANDROID_TOOLCHAIN) endif endif @@ -487,9 +497,11 @@ else ifeq ($(PLATFORM),PLATFORM_ANDROID) $(CC) -shared -o $(RAYLIB_RELEASE_PATH)/libraylib.$(RAYLIB_VERSION).so $(OBJS) $(LDFLAGS) $(LDLIBS) @echo "raylib shared library generated (libraylib.$(RAYLIB_VERSION).so)!" - # WARNING: symbolic links creation on Windows should be done using mklink command, no ln available - cd $(RAYLIB_RELEASE_PATH) && ln -fs libraylib.$(RAYLIB_VERSION).so libraylib.$(RAYLIB_API_VERSION).so - cd $(RAYLIB_RELEASE_PATH) && ln -fs libraylib.$(RAYLIB_VERSION).so libraylib.so + # WARNING: symbolic links creation on Windows should be done using mklink command, no ln available + ifeq ($(HOST_PLATFORM_OS),LINUX) + cd $(RAYLIB_RELEASE_PATH) && ln -fs libraylib.$(RAYLIB_VERSION).so libraylib.$(RAYLIB_API_VERSION).so + cd $(RAYLIB_RELEASE_PATH) && ln -fs libraylib.$(RAYLIB_VERSION).so libraylib.so + endif endif else # Compile raylib static library version $(RAYLIB_VERSION) diff --git a/templates/standard_game/Makefile.Android b/templates/standard_game/Makefile.Android index 87b047229..23a5d28af 100644 --- a/templates/standard_game/Makefile.Android +++ b/templates/standard_game/Makefile.Android @@ -25,15 +25,23 @@ PLATFORM ?= PLATFORM_ANDROID RAYLIB_PATH ?= ..\.. +# Define Android architecture (armeabi-v7a, arm64-v8a, x86, x86-64) and API version +ANDROID_ARCH ?= ARM +ANDROID_API_VERSION = 21 +ifeq ($(ANDROID_ARCH),ARM) + ANDROID_ARCH_NAME = armeabi-v7a +endif +ifeq ($(ANDROID_ARCH),ARM64) + ANDROID_ARCH_NAME = arm64-v8a +endif + # Required path variables # NOTE: JAVA_HOME must be set to JDK +JAVA_HOME ?= C:/JavaJDK ANDROID_HOME = C:/android-sdk -ANDROID_NDK = C:/android-ndk -ANDROID_API_VERSION = 21 -ANDROID_TOOLCHAIN = C:/android_toolchain_arm64_api21 -ANDROID_BUILD_TOOLS = $(ANDROID_HOME)/build-tools/26.0.2 +ANDROID_TOOLCHAIN = C:/android_toolchain_$(ANDROID_ARCH)_API$(ANDROID_API_VERSION) +ANDROID_BUILD_TOOLS = $(ANDROID_HOME)/build-tools/28.0.1 ANDROID_PLATFORM_TOOLS = $(ANDROID_HOME)/platform-tools -JAVA_HOME = C:/PROGRA~1/Java/jdk1.8.0_144 # Android project configuration variables PROJECT_NAME ?= standard_game @@ -62,28 +70,32 @@ APP_KEYSTORE_PASS ?= raylib # Library type used for raylib: STATIC (.a) or SHARED (.so/.dll) RAYLIB_LIBTYPE ?= STATIC -RAYLIB_LIB_PATH = $(RAYLIB_PATH)\release\libs\android\arm64-v8a +RAYLIB_LIB_PATH = $(RAYLIB_PATH)\release\libs\android\$(ANDROID_ARCH_NAME) # Shared libs must be added to APK if required # NOTE: Generated NativeLoader.java automatically load those libraries ifeq ($(RAYLIB_LIBTYPE),SHARED) - PROJECT_SHARED_LIBS = lib/arm64-v8a/libraylib.so + PROJECT_SHARED_LIBS = lib/$(ANDROID_ARCH_NAME)/libraylib.so endif # Compiler and archiver -# NOTE: GCC is being deprectated in Android NDK r16 +# NOTE: GCC is being deprecated in Android NDK r16 CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang AR = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-ar # Compiler flags for arquitecture -#CFLAGS = -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 --> Old 32bit -CFLAGS = -std=c99 -target aarch64 -mfix-cortex-a53-835769 +ifeq ($(ANDROID_ARCH),ARM) + CFLAGS = -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 +endif +ifeq ($(ANDROID_ARCH),ARM64) + CFLAGS = -std=c99 -target aarch64 -mfix-cortex-a53-835769 +endif # Compilation functions attributes options CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC # Compiler options for the linker CFLAGS += -Wall -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes # Preprocessor macro definitions -CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=21 +CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=$(ANDROID_API_VERSION) # Paths containing required header files INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/release/include -I$(RAYLIB_PATH)/src/external/android/native_app_glue @@ -94,7 +106,7 @@ LDFLAGS += -Wl,--build-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl # Force linking of library module to define symbol LDFLAGS += -u ANativeActivity_onCreate # Library paths containing required libs -LDFLAGS += -L. -L$(PROJECT_BUILD_PATH)/obj -L$(PROJECT_BUILD_PATH)/lib/arm64-v8a -L$(ANDROID_TOOLCHAIN)\sysroot\usr\lib +LDFLAGS += -L. -L$(PROJECT_BUILD_PATH)/obj -L$(PROJECT_BUILD_PATH)/lib/$(ANDROID_ARCH_NAME) -L$(ANDROID_TOOLCHAIN)\sysroot\usr\lib # Define any libraries to link into executable # if you want to link libraries (libname.so or libname.a), use the -lname @@ -128,7 +140,7 @@ create_temp_project_dirs: if not exist $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME) mkdir $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME) if not exist $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)\$(APP_PRODUCT_NAME) mkdir $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)\$(APP_PRODUCT_NAME) if not exist $(PROJECT_BUILD_PATH)\lib mkdir $(PROJECT_BUILD_PATH)\lib - if not exist $(PROJECT_BUILD_PATH)\lib\arm64-v8a mkdir $(PROJECT_BUILD_PATH)\lib\arm64-v8a + if not exist $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME) mkdir $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME) if not exist $(PROJECT_BUILD_PATH)\bin mkdir $(PROJECT_BUILD_PATH)\bin if not exist $(PROJECT_BUILD_PATH)\res mkdir $(PROJECT_BUILD_PATH)\res if not exist $(PROJECT_BUILD_PATH)\res\drawable-ldpi mkdir $(PROJECT_BUILD_PATH)\res\drawable-ldpi @@ -148,10 +160,10 @@ endef # NOTE: If using shared libs they are loaded by generated NativeLoader.java copy_project_required_libs: ifeq ($(RAYLIB_LIBTYPE),SHARED) - copy /Y $(RAYLIB_LIB_PATH)\libraylib.so $(PROJECT_BUILD_PATH)\lib\arm64-v8a\libraylib.so + copy /Y $(RAYLIB_LIB_PATH)\libraylib.so $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)\libraylib.so endif ifeq ($(RAYLIB_LIBTYPE),STATIC) - copy /Y $(RAYLIB_LIB_PATH)\libraylib.a $(PROJECT_BUILD_PATH)\lib\arm64-v8a\libraylib.a + copy /Y $(RAYLIB_LIB_PATH)\libraylib.a $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)\libraylib.a endif # Copy project required resources: strings.xml, icon.png, assets @@ -186,7 +198,7 @@ generate_android_manifest: @echo ^> $(PROJECT_BUILD_PATH)/AndroidManifest.xml @echo package="com.$(APP_COMPANY_NAME).$(APP_PRODUCT_NAME)" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml @echo android:versionCode="$(APP_VERSION_CODE)" android:versionName="$(APP_VERSION_NAME)" ^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml - @echo ^ >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml + @echo ^ >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml @echo ^ >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml @echo ^ >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml @echo ^> $(PROJECT_BUILD_PATH)/AndroidManifest.xml @@ -220,7 +232,7 @@ compile_native_app_glue: # Compile project code into a shared library: lib/lib$(PROJECT_LIBRARY_NAME).so compile_project_code: $(OBJS) - $(CC) -o $(PROJECT_BUILD_PATH)/lib/arm64-v8a/lib$(PROJECT_LIBRARY_NAME).so $(OBJS) -shared $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) + $(CC) -o $(PROJECT_BUILD_PATH)/lib/$(ANDROID_ARCH_NAME)/lib$(PROJECT_LIBRARY_NAME).so $(OBJS) -shared $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) # Compile all .c files required into object (.o) files # NOTE: Those files will be linked into a shared library @@ -241,7 +253,7 @@ compile_project_class_dex: # NOTE: Use -A resources to define additional directory in which to find raw asset files create_project_apk_package: $(ANDROID_BUILD_TOOLS)/aapt package -f -M $(PROJECT_BUILD_PATH)/AndroidManifest.xml -S $(PROJECT_BUILD_PATH)/res -A $(PROJECT_BUILD_PATH)/assets -I $(ANDROID_HOME)/platforms/android-$(ANDROID_API_VERSION)/android.jar -F $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).unsigned.apk $(PROJECT_BUILD_PATH)/bin - cd $(PROJECT_BUILD_PATH) && $(ANDROID_BUILD_TOOLS)/aapt add bin/$(PROJECT_NAME).unsigned.apk lib/arm64-v8a/lib$(PROJECT_LIBRARY_NAME).so $(PROJECT_SHARED_LIBS) + cd $(PROJECT_BUILD_PATH) && $(ANDROID_BUILD_TOOLS)/aapt add bin/$(PROJECT_NAME).unsigned.apk lib/$(ANDROID_ARCH_NAME)/lib$(PROJECT_LIBRARY_NAME).so $(PROJECT_SHARED_LIBS) # Create signed APK package using generated Key: bin/$(PROJECT_NAME).signed.apk sign_project_apk_package: @@ -254,7 +266,11 @@ zipalign_project_apk_package: # Install $(PROJECT_NAME).apk to default emulator/device # NOTE: Use -e (emulator) or -d (device) parameters if required install: - $(ANDROID_PLATFORM_TOOLS)/adb install -r $(PROJECT_NAME).apk + $(ANDROID_PLATFORM_TOOLS)/adb install --abi $(ANDROID_ARCH_NAME) -rds $(PROJECT_NAME).apk + +# Check supported ABI for the device (armeabi-v7a, arm64-v8a, x86, x86_64) +check_device_abi: + $(ANDROID_PLATFORM_TOOLS)/adb shell getprop ro.product.cpu.abi # Monitorize output log coming from device, only raylib tag logcat: