diff --git a/dependencies/extension-api/build.gradle b/dependencies/extension-api/build.gradle index fe526ccdb..411c05cd0 100644 --- a/dependencies/extension-api/build.gradle +++ b/dependencies/extension-api/build.gradle @@ -12,6 +12,7 @@ buildscript { apply plugin: 'com.android.library' android { + namespace 'org.haxe.extension' compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION diff --git a/dependencies/extension-api/src/main/AndroidManifest.xml b/dependencies/extension-api/src/main/AndroidManifest.xml index 5bc5fecfe..b2d3ea123 100644 --- a/dependencies/extension-api/src/main/AndroidManifest.xml +++ b/dependencies/extension-api/src/main/AndroidManifest.xml @@ -1,4 +1,2 @@ - - - + diff --git a/project/Build.xml b/project/Build.xml index b7d9172be..81d5aa52d 100755 --- a/project/Build.xml +++ b/project/Build.xml @@ -458,12 +458,6 @@
- - - diff --git a/run.n b/run.n index 2544816fb..2789ab0ca 100644 Binary files a/run.n and b/run.n differ diff --git a/src/lime/system/CFFI.hx b/src/lime/system/CFFI.hx index 568ef394f..3f512807e 100644 --- a/src/lime/system/CFFI.hx +++ b/src/lime/system/CFFI.hx @@ -165,6 +165,11 @@ class CFFI { result = __tryLoad(ndllFolder + __sysName() + "64/" + library, library, method, args); } + + if (result == null) + { + result = __tryLoad(ndllFolder + __sysName() + "Arm64/" + library, library, method, args); + } } } diff --git a/src/lime/system/Clipboard.hx b/src/lime/system/Clipboard.hx index be4516795..f0cb89133 100644 --- a/src/lime/system/Clipboard.hx +++ b/src/lime/system/Clipboard.hx @@ -46,6 +46,8 @@ class Clipboard { _text = FlashClipboard.generalClipboard.getData(TEXT_FORMAT); } + #elseif (js || html5) + _text = cacheText; #end __updated = true; diff --git a/src/lime/tools/AndroidHelper.hx b/src/lime/tools/AndroidHelper.hx index 54235eaaf..e93a640bc 100644 --- a/src/lime/tools/AndroidHelper.hx +++ b/src/lime/tools/AndroidHelper.hx @@ -8,8 +8,6 @@ class AndroidHelper { private static var adbName:String; private static var adbPath:String; - private static var androidName:String; - private static var androidPath:String; private static var emulatorName:String; private static var emulatorPath:String; @@ -159,30 +157,33 @@ class AndroidHelper public static function initialize(project:HXProject):Void { - adbPath = project.environment.get("ANDROID_SDK") + "/tools/"; - androidPath = project.environment.get("ANDROID_SDK") + "/tools/"; - emulatorPath = project.environment.get("ANDROID_SDK") + "/tools/"; + adbPath = project.environment.get("ANDROID_SDK") + "/platform-tools/"; + emulatorPath = project.environment.get("ANDROID_SDK") + "/emulator/"; adbName = "adb"; - androidName = "android"; emulatorName = "emulator"; if (System.hostPlatform == WINDOWS) { adbName += ".exe"; - androidName += ".bat"; emulatorName += ".exe"; } if (!FileSystem.exists(adbPath + adbName)) { - adbPath = project.environment.get("ANDROID_SDK") + "/platform-tools/"; + // in older SDKs, adb was located in /tools/ + adbPath = project.environment.get("ANDROID_SDK") + "/tools/"; + } + + if (!FileSystem.exists(emulatorPath + emulatorName)) + { + // in older SDKs, emulator was located in /tools/ + emulatorPath = project.environment.get("ANDROID_SDK") + "/tools/"; } if (System.hostPlatform != WINDOWS) { adbName = "./" + adbName; - androidName = "./" + androidName; emulatorName = "./" + emulatorName; } @@ -194,8 +195,18 @@ class AndroidHelper public static function install(project:HXProject, targetPath:String, deviceID:String = null):String { + if (!FileSystem.exists(adbPath + adbName)) + { + Log.error("adb not found in Android SDK: " + project.environment.get("ANDROID_SDK")); + } + if (project.targetFlags.exists("emulator") || project.targetFlags.exists("simulator")) { + if (!FileSystem.exists(emulatorPath + emulatorName)) + { + Log.error("emulator not found in Android SDK: " + project.environment.get("ANDROID_SDK")); + } + Log.info("", "Searching for Android emulator"); var devices = listDevices(); @@ -280,16 +291,13 @@ class AndroidHelper public static function listAVDs():Array { var avds = new Array(); - var output = System.runProcess(androidPath, androidName, ["list", "avd"]); - + var output = System.runProcess(emulatorPath, emulatorName, ["-list-avds"]); if (output != null && output != "") { + // -list-avds returns only the avd names, separated by line breaks for (line in output.split("\n")) { - if (line.indexOf("Name") > -1) - { - avds.push(StringTools.trim(line.substr(line.indexOf("Name") + 6))); - } + avds.push(StringTools.trim(line)); } } @@ -343,6 +351,11 @@ class AndroidHelper public static function trace(project:HXProject, debug:Bool, deviceID:String = null, customFilter:String = null):Void { + if (!FileSystem.exists(adbPath + adbName)) + { + Log.error("adb not found in Android SDK: " + project.environment.get("ANDROID_SDK")); + } + // Use -DFULL_LOGCAT or if you do not want to filter log messages var args = ["logcat"]; @@ -395,6 +408,11 @@ class AndroidHelper public static function uninstall(packageName:String, deviceID:String = null):Void { + if (!FileSystem.exists(adbPath + adbName)) + { + Log.error("adb not found in Android SDK"); + } + var args = ["uninstall", packageName]; if (deviceID != null && deviceID != "") diff --git a/src/lime/tools/ProjectXMLParser.hx b/src/lime/tools/ProjectXMLParser.hx index 837b26d2b..835d63693 100644 --- a/src/lime/tools/ProjectXMLParser.hx +++ b/src/lime/tools/ProjectXMLParser.hx @@ -894,7 +894,10 @@ class ProjectXMLParser extends HXProject Log.error(substitute(element.att.value)); case "echo": - Log.println(substitute(element.att.value)); + if (command != "display") + { + Log.println(substitute(element.att.value)); + } case "log": var verbose = ""; @@ -908,21 +911,24 @@ class ProjectXMLParser extends HXProject { Log.error(substitute(element.att.error), verbose); } - else if (element.has.warn) + else if (command != "display") { - Log.warn(substitute(element.att.warn), verbose); - } - else if (element.has.info) - { - Log.info(substitute(element.att.info), verbose); - } - else if (element.has.value) - { - Log.info(substitute(element.att.value), verbose); - } - else if (verbose != "") - { - Log.info("", verbose); + if (element.has.warn) + { + Log.warn(substitute(element.att.warn), verbose); + } + else if (element.has.info) + { + Log.info(substitute(element.att.info), verbose); + } + else if (element.has.value) + { + Log.info(substitute(element.att.value), verbose); + } + else if (verbose != "") + { + Log.info("", verbose); + } } case "path": diff --git a/svg.n b/svg.n index e86d7ef83..a1eac4b05 100644 Binary files a/svg.n and b/svg.n differ diff --git a/templates/android/template/app/build.gradle b/templates/android/template/app/build.gradle index d2e5260d6..f6b9fad10 100644 --- a/templates/android/template/app/build.gradle +++ b/templates/android/template/app/build.gradle @@ -13,6 +13,7 @@ System.setProperty('java.awt.headless','false') } */ android { + namespace "::APP_PACKAGE::" compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION ::if (ANDROID_GRADLE_PLUGIN>="4.0")::ndkPath '::ANDROID_NDK_ROOT_ESCAPED::'::end:: diff --git a/templates/android/template/app/src/main/AndroidManifest.xml b/templates/android/template/app/src/main/AndroidManifest.xml index efc8132cc..aeac9518c 100644 --- a/templates/android/template/app/src/main/AndroidManifest.xml +++ b/templates/android/template/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/templates/extension/dependencies/android/build.gradle b/templates/extension/dependencies/android/build.gradle index 8b5014f91..40f326da8 100644 --- a/templates/extension/dependencies/android/build.gradle +++ b/templates/extension/dependencies/android/build.gradle @@ -12,6 +12,7 @@ buildscript { apply plugin: 'com.android.library' android { + namespace "org.haxe.extension.::extensionLowerCase::" compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION } diff --git a/templates/extension/dependencies/android/src/main/AndroidManifest.xml b/templates/extension/dependencies/android/src/main/AndroidManifest.xml index 698a1e3ce..b2d3ea123 100644 --- a/templates/extension/dependencies/android/src/main/AndroidManifest.xml +++ b/templates/extension/dependencies/android/src/main/AndroidManifest.xml @@ -1,6 +1,2 @@ - - - - - \ No newline at end of file + diff --git a/tools/CommandLineTools.hx b/tools/CommandLineTools.hx index c2a27f105..de0993451 100644 --- a/tools/CommandLineTools.hx +++ b/tools/CommandLineTools.hx @@ -485,15 +485,14 @@ class CommandLineTools } case MAC: - // if (System.hostArchitecture == X64) { - - untyped $loader.path = $array(path + "Mac64/", $loader.path); - - // } else { - - // untyped $loader.path = $array (path + "Mac/", $loader.path); - - // } + if (System.hostArchitecture == X64) + { + untyped $loader.path = $array(path + "Mac64/", $loader.path); + } + else if (System.hostArchitecture == ARM64) + { + untyped $loader.path = $array(path + "MacArm64/", $loader.path); + } case LINUX: var arguments = Sys.args(); diff --git a/tools/RunScript.hx b/tools/RunScript.hx index 0f4243a15..ec9314018 100644 --- a/tools/RunScript.hx +++ b/tools/RunScript.hx @@ -35,7 +35,7 @@ class RunScript if (!rebuildBinaries) return; - var platforms = ["Windows", "Mac", "Mac64", "Linux", "Linux64"]; + var platforms = ["Windows", "Mac", "Mac64", "MacArm64", "Linux", "Linux64"]; for (platform in platforms) { @@ -64,7 +64,7 @@ class RunScript System.runCommand(limeDirectory, "neko", args.concat(["windows", toolsDirectory])); } - case "Mac", "Mac64": + case "Mac", "Mac64", "MacArm64": if (System.hostPlatform == MAC) { System.runCommand(limeDirectory, "neko", args.concat(["mac", toolsDirectory])); diff --git a/tools/SVGExport.hx b/tools/SVGExport.hx index c11c9774d..94b442337 100644 --- a/tools/SVGExport.hx +++ b/tools/SVGExport.hx @@ -67,8 +67,14 @@ class SVGExport // } case MAC: - untyped $loader.path = $array(path + "Mac/", $loader.path); - untyped $loader.path = $array(path + "Mac64/", $loader.path); + if (System.hostArchitecture == X64) + { + untyped $loader.path = $array(path + "Mac64/", $loader.path); + } + else if (System.hostArchitecture == ARM64) + { + untyped $loader.path = $array(path + "MacArm64/", $loader.path); + } case LINUX: var arguments = Sys.args(); diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index e33f52744..7fbe55a89 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -2,6 +2,7 @@ package; import haxe.io.Eof; import hxp.Haxelib; +import hxp.HostArchitecture; import hxp.HXML; import hxp.Log; import hxp.Path; @@ -190,6 +191,17 @@ class MacPlatform extends PlatformTarget NekoHelper.createExecutable(project.templatePaths, "mac" + dirSuffix.toLowerCase(), targetDirectory + "/obj/ApplicationMain.n", executablePath); NekoHelper.copyLibraries(project.templatePaths, "mac" + dirSuffix.toLowerCase(), executableDirectory); + + // starting in xcode 15, rpath doesn't automatically include + // /usr/local/lib, but we need it for libneko dylib + System.runCommand("", "install_name_tool", ["-add_rpath", "/usr/local/lib", Path.join([executableDirectory, "lime.ndll"])]); + if (System.hostArchitecture == HostArchitecture.ARM64) + { + // on Apple Silicon, the user may have installed Neko with + // Homebrew, which has a different path. however, if the + // Homebrew path doesn't exist, that's okay. + System.runCommand("", "install_name_tool", ["-add_rpath", "/opt/homebrew/lib", Path.join([executableDirectory, "lime.ndll"])]); + } } else if (targetType == "hl") { @@ -584,7 +596,7 @@ class MacPlatform extends PlatformTarget private inline function get_dirSuffix():String { - return targetArchitecture == X64 ? "64" : ""; + return targetArchitecture == X64 ? "64" : targetArchitecture == ARM64 ? "Arm64" : ""; } /**