@@ -12,6 +12,7 @@ plugins {
1212import de.undercouch.gradle.tasks.download.Download
1313import org.apache.tools.ant.taskdefs.condition.Os
1414import org.apache.tools.ant.filters.ReplaceTokens
15+ import groovy.json.JsonSlurper
1516
1617// We download various C++ open-source dependencies into downloads.
1718// We then copy both the downloaded code and our custom makefiles and headers into third-party-ndk.
@@ -68,7 +69,7 @@ task prepareDoubleConversion(dependsOn: dependenciesPath ? [] : [downloadDoubleC
6869 from dependenciesPath ?: tarTree(downloadDoubleConversion. dest)
6970 from ' src/main/jni/third-party/double-conversion/Android.mk'
7071 include " double-conversion-${ DOUBLE_CONVERSION_VERSION} /src/**/*" , ' Android.mk'
71- filesMatching(' */src/**/*' , {fname -> fname. path = " double-conversion/${ fname.name} " })
72+ filesMatching(' */src/**/*' , { fname -> fname. path = " double-conversion/${ fname.name} " })
7273 includeEmptyDirs = false
7374 into " $thirdPartyNdkDir /double-conversion"
7475}
@@ -84,17 +85,17 @@ task prepareFolly(dependsOn: dependenciesPath ? [] : [downloadFolly], type: Copy
8485 from dependenciesPath ?: tarTree(downloadFolly. dest)
8586 from ' src/main/jni/third-party/folly/Android.mk'
8687 include " folly-${ FOLLY_VERSION} /folly/**/*" , ' Android.mk'
87- eachFile {fname -> fname. path = (fname. path - " folly-${ FOLLY_VERSION} /" )}
88+ eachFile { fname -> fname. path = (fname. path - " folly-${ FOLLY_VERSION} /" ) }
8889 includeEmptyDirs = false
8990
9091 // Patch for folly build break on gcc 4.9 and could be removed after build by clang
9192 filesMatching(' **/container/detail/F14Policy.h' ) {
9293 filter(ReplaceTokens , tokens : [
93- ' ObjectHolder(Args&&... args) : value_{std::forward<Args>(args)...} {}' : ' ObjectHolder(Args&&... args) : value_({std::forward<Args>(args)...}) {}' ,
94- ' ObjectHolder(Args&&... args) : T{std::forward<Args>(args)...} {}' : ' ObjectHolder(Args&&... args) : T({std::forward<Args>(args)...}) {}' ,
94+ ' ObjectHolder(Args&&... args) : value_{std::forward<Args>(args)...} {}' : ' ObjectHolder(Args&&... args) : value_({std::forward<Args>(args)...}) {}' ,
95+ ' ObjectHolder(Args&&... args) : T{std::forward<Args>(args)...} {}' : ' ObjectHolder(Args&&... args) : T({std::forward<Args>(args)...}) {}' ,
9596 ],
96- beginToken : ' ' ,
97- endToken : ' ' )
97+ beginToken : ' ' ,
98+ endToken : ' ' )
9899 }
99100
100101 into " $thirdPartyNdkDir /folly"
@@ -116,20 +117,20 @@ task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy)
116117 includeEmptyDirs = false
117118 filesMatching(' **/*.h.in' ) {
118119 filter(ReplaceTokens , tokens : [
119- ac_cv_have_unistd_h : ' 1' ,
120- ac_cv_have_stdint_h : ' 1' ,
121- ac_cv_have_systypes_h : ' 1' ,
122- ac_cv_have_inttypes_h : ' 1' ,
123- ac_cv_have_libgflags : ' 0' ,
124- ac_google_start_namespace : ' namespace google {' ,
125- ac_cv_have_uint16_t : ' 1' ,
126- ac_cv_have_u_int16_t : ' 1' ,
127- ac_cv_have___uint16 : ' 0' ,
128- ac_google_end_namespace : ' }' ,
129- ac_cv_have___builtin_expect : ' 1' ,
130- ac_google_namespace : ' google' ,
131- ac_cv___attribute___noinline : ' __attribute__ ((noinline))' ,
132- ac_cv___attribute___noreturn : ' __attribute__ ((noreturn))' ,
120+ ac_cv_have_unistd_h : ' 1' ,
121+ ac_cv_have_stdint_h : ' 1' ,
122+ ac_cv_have_systypes_h : ' 1' ,
123+ ac_cv_have_inttypes_h : ' 1' ,
124+ ac_cv_have_libgflags : ' 0' ,
125+ ac_google_start_namespace : ' namespace google {' ,
126+ ac_cv_have_uint16_t : ' 1' ,
127+ ac_cv_have_u_int16_t : ' 1' ,
128+ ac_cv_have___uint16 : ' 0' ,
129+ ac_google_end_namespace : ' }' ,
130+ ac_cv_have___builtin_expect : ' 1' ,
131+ ac_google_namespace : ' google' ,
132+ ac_cv___attribute___noinline : ' __attribute__ ((noinline))' ,
133+ ac_cv___attribute___noreturn : ' __attribute__ ((noreturn))' ,
133134 ac_cv___attribute___printf_4_5 : ' __attribute__((__format__ (__printf__, 4, 5)))'
134135 ])
135136 it. path = (it. name - ' .in' )
@@ -145,40 +146,61 @@ task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy)
145146 }
146147}
147148
148- task downloadJSCHeaders (type : Download ) {
149- // in sync with webkit SVN revision 174650
150- def jscAPIBaseURL = ' https://raw.githubusercontent.com/WebKit/webkit/38b15a3ba3c1b0798f2036f7cea36ffdc096202e/Source/JavaScriptCore/API/'
151- def jscHeaderFiles = [' JavaScript.h' , ' JSBase.h' , ' JSContextRef.h' , ' JSObjectRef.h' , ' JSStringRef.h' , ' JSValueRef.h' , ' WebKitAvailability.h' ]
152- def output = new File (downloadsDir, ' jsc' )
153- output. mkdirs()
154- src(jscHeaderFiles. collect { headerName -> " $jscAPIBaseURL $headerName " })
149+ def readFromCommandLine (String cmd ) {
150+ new ByteArrayOutputStream (). withStream { os ->
151+ exec {
152+ standardOutput os
153+ commandLine cmd. split(" " )
154+ }. assertNormalExitValue()
155+ return os. toString(). trim()
156+ }
157+ }
158+
159+ def isIdeBuild () {
160+ return project. properties[' android.injected.invoked.from.ide' ] == ' true'
161+ }
162+
163+ task downloadJSC (dependsOn : createNativeDepsDirectories, type : Download ) {
164+ if (isIdeBuild()) return
165+
166+ def packageJson = new JsonSlurper (). parse(file(" ${ rootDir} /package.json" ))
167+ def jscVersionName = packageJson. devDependencies[" jsc-android" ]
168+ def jscVersion = readFromCommandLine(" npm info jsc-android@$jscVersionName version" )
169+ def url = readFromCommandLine(" npm info jsc-android@$jscVersionName dist.tarball" )
170+ src " $url "
155171 onlyIfNewer true
156172 overwrite false
157- dest output
173+ dest new File (downloadsDir, " jsc- ${ jscVersion } .tar.gz " )
158174}
159175
160- // Create Android.mk library module based on so files from mvn + include headers fetched from webkit.org
161- task prepareJSC (dependsOn : dependenciesPath ? [] : [downloadJSCHeaders]) {
162- doLast {
163- copy {
164- from zipTree(configurations. compile. fileCollection { dep -> dep. name == ' android-jsc' }. singleFile)
165- from dependenciesPath ? " $dependenciesPath /jsc-headers" : {downloadJSCHeaders. dest}
166- from ' src/main/jni/third-party/jsc'
167- include ' jni/**/*.so' , ' *.h' , ' Android.mk'
168- filesMatching(' *.h' , { fname -> fname. path = " JavaScriptCore/${ fname.path} " })
169- into " $thirdPartyNdkDir /jsc" ;
170- }
176+ // Create Android.mk library module based on jsc from npm
177+ task prepareJSC (dependsOn : downloadJSC) << {
178+ copy {
179+ def jscTar = tarTree(downloadJSC. dest)
180+ def jscAAR = jscTar. matching({ it. include " **/android-jsc/**/*.aar" }). singleFile
181+ def soFiles = zipTree(jscAAR). matching({ it. include " **/*.so" })
182+
183+ def headerFiles = jscTar. matching({ it. include " **/include/*.h" })
184+
185+ from soFiles
186+ from headerFiles
187+ from " src/main/jni/third-party/jsc/Android.mk"
188+
189+ filesMatching(" **/*.h" , { it. path = " JavaScriptCore/${ it.name} " })
190+
191+ includeEmptyDirs false
192+ into " $thirdPartyNdkDir /jsc"
171193 }
172194}
173195
174196task downloadNdkBuildDependencies {
175- if (! boostPath) {
176- dependsOn downloadBoost
177- }
178- dependsOn downloadDoubleConversion
179- dependsOn downloadFolly
180- dependsOn downloadGlog
181- dependsOn downloadJSCHeaders
197+ if (! boostPath) {
198+ dependsOn downloadBoost
199+ }
200+ dependsOn downloadDoubleConversion
201+ dependsOn downloadFolly
202+ dependsOn downloadGlog
203+ dependsOn downloadJSC
182204}
183205
184206def getNdkBuildName () {
@@ -217,23 +239,23 @@ def getNdkBuildFullPath() {
217239 def ndkBuildFullPath = findNdkBuildFullPath()
218240 if (ndkBuildFullPath == null ) {
219241 throw new GradleScriptException (
220- " ndk-build binary cannot be found, check if you've set " +
221- " \$ ANDROID_NDK environment variable correctly or if ndk.dir is " +
222- " setup in local.properties" ,
223- null )
242+ " ndk-build binary cannot be found, check if you've set " +
243+ " \$ ANDROID_NDK environment variable correctly or if ndk.dir is " +
244+ " setup in local.properties" ,
245+ null )
224246 }
225247 if (! new File (ndkBuildFullPath). canExecute()) {
226248 throw new GradleScriptException (
227- " ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n " +
228- " Check that the \$ ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n " +
229- " (On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ ndk or C:/ndk rather than C:\\ ndk)" ,
230- null )
249+ " ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n " +
250+ " Check that the \$ ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n " +
251+ " (On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ ndk or C:/ndk rather than C:\\ ndk)" ,
252+ null )
231253 }
232254 return ndkBuildFullPath
233255}
234256
235257task buildReactNdkLib (dependsOn : [prepareJSC, prepareBoost, prepareDoubleConversion, prepareFolly, prepareGlog], type : Exec ) {
236- inputs. dir (' src/main/jni/react' )
258+ inputs. file (' src/main/jni/react' )
237259 outputs. dir(" $buildDir /react-ndk/all" )
238260 commandLine getNdkBuildFullPath(),
239261 ' NDK_PROJECT_PATH=null' ,
@@ -244,21 +266,27 @@ task buildReactNdkLib(dependsOn: [prepareJSC, prepareBoost, prepareDoubleConvers
244266 " REACT_COMMON_DIR=$projectDir /../ReactCommon" ,
245267 " REACT_SRC_DIR=$projectDir /src/main/java/com/facebook/react" ,
246268 ' -C' , file(' src/main/jni/react/jni' ). absolutePath,
247- ' --jobs' , project. hasProperty (" jobs" ) ? project . property( " jobs " ) : Runtime . runtime. availableProcessors()
269+ ' --jobs' , project. findProperty (" jobs" ) ?: Runtime . runtime. availableProcessors()
248270}
249271
250272task cleanReactNdkLib (type : Exec ) {
273+ ignoreExitValue true
274+ errorOutput new ByteArrayOutputStream ()
251275 commandLine getNdkBuildFullPath(),
252276 " NDK_APPLICATION_MK=$projectDir /src/main/jni/Application.mk" ,
253277 " THIRD_PARTY_NDK_DIR=$buildDir /third-party-ndk" ,
254278 " REACT_COMMON_DIR=$projectDir /../ReactCommon" ,
255279 ' -C' , file(' src/main/jni/react/jni' ). absolutePath,
256280 ' clean'
281+ doLast {
282+ file(AAR_OUTPUT_URL ). delete()
283+ println " Deleted aar output dir at ${ file(AAR_OUTPUT_URL)} "
284+ }
257285}
258286
259287task packageReactNdkLibs (dependsOn : buildReactNdkLib, type : Copy ) {
260288 from " $buildDir /react-ndk/all"
261- exclude ' **/libjsc.so '
289+ from " $t hirdPartyNdkDir /jsc/jni "
262290 into " $buildDir /react-ndk/exported"
263291}
264292
@@ -269,7 +297,6 @@ task packageReactNdkLibsForBuck(dependsOn: packageReactNdkLibs, type: Copy) {
269297
270298android {
271299 compileSdkVersion 27
272- buildToolsVersion " 27.0.3"
273300
274301 defaultConfig {
275302 minSdkVersion 16
@@ -291,7 +318,7 @@ android {
291318
292319 sourceSets. main {
293320 jni. srcDirs = []
294- jniLibs. srcDirs = [ " $buildDir /react-ndk/exported" , ' src/main/jni/third-party/jsc/jni ' ]
321+ jniLibs. srcDir " $buildDir /react-ndk/exported"
295322 res. srcDirs = [' src/main/res/devsupport' , ' src/main/res/shell' , ' src/main/res/views/modal' , ' src/main/res/views/uimanager' ]
296323 java {
297324 srcDirs = [' src/main/java' , ' src/main/libraries/soloader/java' , ' src/main/jni/first-party/fb/jni/java' ]
@@ -326,7 +353,6 @@ dependencies {
326353 api " com.squareup.okhttp3:okhttp:${ OKHTTP_VERSION} "
327354 api " com.squareup.okhttp3:okhttp-urlconnection:${ OKHTTP_VERSION} "
328355 api ' com.squareup.okio:okio:1.14.0'
329- compile ' org.webkit:android-jsc:r174650'
330356
331357 testImplementation " junit:junit:${ JUNIT_VERSION} "
332358 testImplementation " org.powermock:powermock-api-mockito:${ POWERMOCK_VERSION} "
0 commit comments