diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 5a384f23c12913..9f9adaf4bacd11 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -318,6 +318,20 @@ android { // This flag will suppress "fcntl(): Bad file descriptor" warnings on local builds. arguments "--output-sync=none" } + + // Note: On Windows there are limits on number of character in file paths and in command lines + // Ref: https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#Path-Length-Limits + // NDK allows circumventing command line limits using response(RSP) files as inputs using NDK_APP_SHORT_COMMANDS flag. + // + // Windows can support long file paths if configured through registry or by prefixing all file paths with a special character sequence + // The latter requires changes in NDK. And there are tools in NDK (AR) which is not able to handle long paths (>256) even after setting the registry key. + // The new architecutre source tree is too deep, and the object file naming conventions in NDK makes the matters worse, by producing incredibly long file paths. + // Other solutions such as symlinking source code etc. didn't work as expected, and makes the build scripts complicated and hard to manage. + // This change temporarily works around the issue by placing the temporary build outputs as short a path as possible within the project path. + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + arguments "NDK_OUT=${rootProject.projectDir.getParent()}\\.cxx", + "NDK_APP_SHORT_COMMANDS=true" + } } } ndk { diff --git a/template/android/app/build.gradle b/template/android/app/build.gradle index a173c56b4e9897..16bd537462e63d 100644 --- a/template/android/app/build.gradle +++ b/template/android/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: "com.android.application" import com.android.build.OutputFile +import org.apache.tools.ant.taskdefs.condition.Os /** * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets @@ -157,6 +158,12 @@ android { // Make sure this target name is the same you specify inside the // src/main/jni/Android.mk file for the `LOCAL_MODULE` variable. targets "helloworld_appmodules" + + // Fix for windows limit on number of character in file paths and in command lines + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + arguments "NDK_OUT=${rootProject.projectDir.getParent()}\\.cxx", + "NDK_APP_SHORT_COMMANDS=true" + } } } }