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" : "";
}
/**