Browse Source

Add a script that generates android project directories

Panagiotis Christopoulos Charitos 4 years ago
parent
commit
8e9c31d7c9

+ 18 - 0
AnKi/Config.h.cmake

@@ -204,4 +204,22 @@
 #else
 #	define ANKI_INTERNAL [[deprecated("This is an AnKi internal interface. Don't use it")]]
 #endif
+
+// Define the main() function.
+#if ANKI_OS_ANDROID
+#	define ANKI_MAIN_FUNCTION(myMain) \
+	int myMain(int argc, char* argv[]); \
+	void android_main(struct android_app* app) \
+	{ \
+		char* argv[] = {"androidapp"}; \
+		myMain(1, argv); \
+	}
+#else
+#	define ANKI_MAIN_FUNCTION(myMain) \
+	int myMain(int argc, char* argv[]); \
+	int main(int argc, char* argv[]) \
+	{ \
+		return myMain(argc, argv); \
+	}
+#endif
 /// @}

+ 3 - 3
AnKi/Util/Assert.cpp

@@ -20,17 +20,17 @@ namespace anki
 void akassert(const char* exprTxt, const char* file, int line, const char* func)
 {
 #	if ANKI_OS_ANDROID
-	__android_log_print(ANDROID_LOG_ERROR, "AnKi", "(%s:%d %s) Assertion failed: %s", file, line, func, exprTxt);
+	__android_log_print(ANDROID_LOG_ERROR, "AnKi", "Assertion failed: %s (%s:%d %s)", exprTxt, file, line, func);
 #	else
 #		if ANKI_OS_LINUX
 	if(runningFromATerminal())
 	{
-		fprintf(stderr, "\033[1;31m(%s:%d %s) Assertion failed: %s\033[0m\n", file, line, func, exprTxt);
+		fprintf(stderr, "\033[1;31mAssertion failed: %s (%s:%d %s)\033[0m\n", exprTxt, file, line, func);
 	}
 	else
 #		endif
 	{
-		fprintf(stderr, "(%s:%d %s) Assertion failed: %s\n", file, line, func, exprTxt);
+		fprintf(stderr, "Assertion failed: %s (%s:%d %s)\n", exprTxt, file, line, func);
 	}
 #	endif
 

+ 1 - 1
AnKi/Util/File.cpp

@@ -144,7 +144,7 @@ Error File::openCFile(const CString& filename, FileOpenFlag flags)
 #if ANKI_OS_ANDROID
 Error File::openAndroidFile(const CString& filename, FileOpenFlag flags)
 {
-	ANKI_ASSERT(!!(flags & FileOpenFlags::SPECIAL));
+	ANKI_ASSERT(!!(flags & FileOpenFlag::SPECIAL));
 
 	if(!!(flags & FileOpenFlag::WRITE))
 	{

+ 11 - 2
CMakeLists.txt

@@ -216,7 +216,7 @@ else()
 	add_compile_options("/FC")
 endif()
 
-# Use gold linker
+# Use LLD or gold linker
 if(UNIX AND NOT APPLE)
 	execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=lld -Wl,--version ERROR_QUIET OUTPUT_VARIABLE ld_version)
 	if("${ld_version}" MATCHES "compatible with GNU linkers" AND "${ld_version}" MATCHES "LLD")
@@ -269,6 +269,11 @@ foreach(TMP ${ANKI_EXTERN_SUB_DIRS})
 	add_subdirectory(ThirdParty/${TMP})
 endforeach()
 
+if(ANDROID)
+	add_library(AnKiAndroidNativeGlue ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
+	set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
+endif()
+
 ################################################################################
 # AnKi                                                                         #
 ################################################################################
@@ -367,7 +372,9 @@ if(NOT MSVC)
 	add_definitions("-pedantic -Wno-unknown-warning-option -Wall -W -Wextra -Wstrict-aliasing -Wwrite-strings -Wunused "
 		"-Wno-unused-parameter -Wundef -Wno-ignored-attributes -Wno-implicit-fallthrough -Wunused-result "
 		"-Wconversion -Wno-sign-conversion -Wno-keyword-macro -Wno-string-conversion -Wno-class-memaccess "
-		"-Wunused-variable -std=c++14")
+		"-Wunused-variable")
+
+	set(CMAKE_CXX_STANDARD 14)
 else()
 	#add_definitions("/wd4996 /wd4244 /wd4262 /wd4267 /wd26495 /wd26439")
 	add_compile_definitions("_CRT_SECURE_NO_WARNINGS=1") # Disable some string function warnings
@@ -393,6 +400,8 @@ elseif(ANDROID)
 	set(THIRD_PARTY_LIBS log android)
 	#include_directories("${ANDROID_NDK}/sources/android/native_app_glue")
 	#set(_SYS_SRC "${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c")
+
+	set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} AnKiAndroidNativeGlue)
 elseif(WINDOWS)
 	if(GL)
 		set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} AnKiGlew opengl32)

+ 3 - 0
Samples/Sponza/GenerateAndroidProject.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+../../Tools/Android/GenerateAndroidProject.py -o ../.. -t Sponza -a ./Assets/

+ 2 - 1
Samples/Sponza/Main.cpp

@@ -23,7 +23,8 @@ public:
 	}
 };
 
-int main(int argc, char* argv[])
+ANKI_MAIN_FUNCTION(myMain)
+int myMain(int argc, char* argv[])
 {
 	Error err = Error::NONE;
 

+ 90 - 0
Tools/Android/GenerateAndroidProject.py

@@ -0,0 +1,90 @@
+#!/usr/bin/python
+
+# Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
+# All rights reserved.
+# Code licensed under the BSD License.
+# http://www.anki3d.org/LICENSE
+
+import os
+import optparse
+import shutil
+import fileinput
+import sys
+
+
+class Context:
+    target = ""
+    asserts_dir = ""
+    out_dir = ""
+
+
+def parse_commandline():
+    """ Parse the command line arguments """
+
+    parser = optparse.OptionParser(usage="usage: %prog [options]", description="Generate an Android gradle project")
+
+    parser.add_option("-o", "--out-dir", dest="out_dir", type="string", help="Where to create the project")
+    parser.add_option("-t", "--target", dest="target", type="string", help="The name of .so to package")
+    parser.add_option("-a", "--assets", dest="assets", type="string", help="Assets directory")
+
+    (options, args) = parser.parse_args()
+
+    required = "target assets out_dir".split()
+    for r in required:
+        if options.__dict__[r] is None:
+            parser.print_help()
+            parser.error("parameter \"%s\" required" % r)
+
+    ctx = Context()
+    ctx.target = options.target
+    ctx.asserts_dir = os.path.abspath(options.assets)
+    ctx.out_dir = os.path.abspath(options.out_dir)
+
+    return ctx
+
+
+def replace_in_file(filename, to_replace, to_replace_with):
+    with fileinput.FileInput(filename, inplace=True) as file:
+        for line in file:
+            print(line.replace(to_replace, to_replace_with), end="")
+
+
+def main():
+    """ The main """
+
+    ctx = parse_commandline()
+
+    # Copy dir
+    project_dir = os.path.join(ctx.out_dir, "AndroidProject_%s" % ctx.target)
+    if os.path.isdir(project_dir):
+        raise Exception("Directory already exists: %s" % project_dir)
+
+    this_script_dir = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+    shutil.copytree(this_script_dir, project_dir)
+
+    # RM the script
+    os.remove(os.path.join(project_dir, "GenerateAndroidProject.py"))
+
+    # Create the assets dir structure
+    assets_dir = os.path.join(project_dir, "assets")
+    os.mkdir(assets_dir)
+    os.mkdir(os.path.join(project_dir, "assets/AnKi/"))
+    os.symlink(os.path.join(this_script_dir, "../../AnKi/Shaders"), os.path.join(project_dir, "assets/AnKi/Shaders"))
+    os.symlink(os.path.join(this_script_dir, "../../EngineAssets"), os.path.join(project_dir, "assets/EngineAssets"))
+    os.symlink(ctx.asserts_dir, os.path.join(project_dir, "assets/Assets"))
+
+    # strings.xml
+    replace_in_file(os.path.join(project_dir, "app/src/main/res/values/strings.xml"), "%APP_NAME%", ctx.target)
+
+    # build.gradle
+    build_gradle = os.path.join(project_dir, "app/build.gradle")
+    replace_in_file(build_gradle, "%TARGET%", ctx.target)
+    replace_in_file(build_gradle, "%PYTHON%", sys.executable)
+    replace_in_file(build_gradle, "%CMAKE%", os.path.join(this_script_dir, "../../CMakeLists.txt"))
+
+    # Done
+    print("Generated project: %s" % project_dir)
+
+
+if __name__ == "__main__":
+    main()

+ 42 - 11
Tools/Android/app/build.gradle

@@ -4,23 +4,54 @@ android {
     compileSdkVersion 30
     ndkVersion "22.1.7171670"
     defaultConfig {
-        applicationId "org.anki.sponza"
+        applicationId "org.anki.%TARGET%"
         minSdkVersion 24
         targetSdkVersion 30
-        versionCode 1
-        versionName "0.0.1"
+        archivesBaseName = "$applicationId"
+    }
+
+    buildTypes {
+        debug {
+            externalNativeBuild {
+                cmake {
+                    abiFilters "arm64-v8a"
+                    arguments "-DANDROID_TOOLCHAIN=clang",
+                            "-DANDROID_STL=c++_static",
+                            "-DCMAKE_BUILD_TYPE=Debug",
+                            "-DANKI_EXTRA_CHECKS=ON",
+                            "-DPYTHON_EXECUTABLE:FILEPATH=%PYTHON%"
+                    version "3.12+"
+                    targets "%TARGET%"
+                }
+            }
+
+            debuggable true
+            jniDebuggable true
+        }
 
-        externalNativeBuild {
-            cmake {
-                // armeabi is not supported, not building for mips in samples
-                abiFilters "arm64-v8a"
-                arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_static"//, "-DPYTHON_EXECUTABLE:FILEPATH=C:\\Users\\pancha01\\AppData\\Local\\Programs\\Python\\Python39\\python.exe"
-                version "3.12+"
-                targets "Sponza"
+        release {
+            externalNativeBuild {
+                cmake {
+                    abiFilters "arm64-v8a"
+                    arguments "-DANDROID_TOOLCHAIN=clang",
+                            "-DANDROID_STL=c++_static",
+                            "-DCMAKE_BUILD_TYPE=Release",
+                            "-DANKI_EXTRA_CHECKS=OFF",
+                            "-DPYTHON_EXECUTABLE:FILEPATH=%PYTHON%"
+                    version "3.12+"
+                    targets "%TARGET%"
+                }
             }
         }
     }
-    externalNativeBuild.cmake.path '../../../CMakeLists.txt'
+
+    externalNativeBuild.cmake.path "%CMAKE%"
     buildTypes.release.minifyEnabled = false
+
+    sourceSets {
+        main {
+            assets.srcDirs = ["../assets"]
+        }
+    }
 }
 

+ 1 - 1
Tools/Android/app/src/main/res/values/strings.xml

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <string name="app_name">app_name</string>
+    <string name="app_name">%APP_NAME%</string>
 </resources>