Index: build/android/gradle/generate_gradle.py |
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py |
index 6a6e850d7e833ef2093d95ae22711f9e3cfeefbb..d20ec41a380cd07161a8e9f657d29d6f0ac23d61 100755 |
--- a/build/android/gradle/generate_gradle.py |
+++ b/build/android/gradle/generate_gradle.py |
@@ -34,6 +34,8 @@ _JINJA_TEMPLATE_PATH = os.path.join( |
_JAVA_SUBDIR = 'symlinked-java' |
_SRCJARS_SUBDIR = 'extracted-srcjars' |
+_JNI_LIBS_SUBDIR = 'symlinked-libs' |
+_ARMEABI_SUBDIR = 'armeabi' |
_DEFAULT_TARGETS = [ |
# TODO(agrieve): Requires alternate android.jar to compile. |
@@ -183,6 +185,13 @@ def _ComputeJavaSourceDirs(java_files): |
return list(found_roots) |
+def _CreateRelativeSymlink(target_path, link_path): |
+ link_dir = os.path.dirname(link_path) |
+ relpath = os.path.relpath(target_path, link_dir) |
+ logging.debug('Creating symlink %s -> %s', link_path, relpath) |
+ os.symlink(relpath, link_path) |
+ |
+ |
def _CreateSymlinkTree(entry_output_dir, symlink_dir, desired_files, |
parent_dirs): |
"""Creates a directory tree of symlinks to the given files. |
@@ -199,9 +208,7 @@ def _CreateSymlinkTree(entry_output_dir, symlink_dir, desired_files, |
symlinked_dir = os.path.dirname(symlinked_path) |
if not os.path.exists(symlinked_dir): |
os.makedirs(symlinked_dir) |
- relpath = os.path.relpath(target_path, symlinked_dir) |
- logging.debug('Creating symlink %s -> %s', symlinked_path, relpath) |
- os.symlink(relpath, symlinked_path) |
+ _CreateRelativeSymlink(target_path, symlinked_path) |
def _CreateJavaSourceDir(output_dir, entry_output_dir, java_files): |
@@ -239,6 +246,27 @@ def _CreateJavaSourceDir(output_dir, entry_output_dir, java_files): |
return java_dirs |
+def _CreateJniLibsDir(output_dir, entry_output_dir, so_files): |
+ """Creates directory with symlinked .so files if necessary. |
+ |
+ Returns list of JNI libs directories.""" |
+ |
+ if so_files: |
+ symlink_dir = os.path.join(entry_output_dir, _JNI_LIBS_SUBDIR) |
+ shutil.rmtree(symlink_dir, True) |
+ abi_dir = os.path.join(symlink_dir, _ARMEABI_SUBDIR) |
+ if not os.path.exists(abi_dir): |
+ os.makedirs(abi_dir) |
+ for so_file in so_files: |
+ target_path = os.path.join(output_dir, so_file) |
+ symlinked_path = os.path.join(abi_dir, so_file) |
+ _CreateRelativeSymlink(target_path, symlinked_path) |
+ |
+ return [symlink_dir] |
+ |
+ return [] |
+ |
+ |
def _GenerateLocalProperties(sdk_dir): |
"""Returns the data for project.properties as a string.""" |
return '\n'.join([ |
@@ -247,8 +275,9 @@ def _GenerateLocalProperties(sdk_dir): |
'']) |
-def _GenerateGradleFile(build_config, build_vars, java_dirs, relativize, |
- use_gradle_process_resources, jinja_processor): |
+def _GenerateGradleFile(build_config, build_vars, java_dirs, jni_libs, |
+ relativize, use_gradle_process_resources, |
+ jinja_processor): |
"""Returns the data for a project's build.gradle.""" |
deps_info = build_config['deps_info'] |
gradle = build_config['gradle'] |
@@ -288,6 +317,7 @@ def _GenerateGradleFile(build_config, build_vars, java_dirs, relativize, |
_DEFAULT_ANDROID_MANIFEST_PATH) |
variables['android_manifest'] = relativize(android_manifest) |
variables['java_dirs'] = relativize(java_dirs) |
+ variables['jni_libs'] = relativize(jni_libs) |
# TODO(agrieve): Add an option to use interface jars and see if that speeds |
# things up at all. |
variables['prebuilts'] = relativize(gradle['dependent_prebuilt_jars']) |
@@ -444,8 +474,15 @@ def main(): |
if srcjars: |
java_dirs.append(os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) |
- data = _GenerateGradleFile(build_config, build_vars, java_dirs, relativize, |
- args.use_gradle_process_resources, |
+ native_section = build_config.get('native') |
+ if native_section: |
+ jni_libs = _CreateJniLibsDir( |
+ output_dir, entry_output_dir, native_section.get('libraries')) |
+ else: |
+ jni_libs = [] |
+ |
+ data = _GenerateGradleFile(build_config, build_vars, java_dirs, jni_libs, |
+ relativize, args.use_gradle_process_resources, |
jinja_processor) |
if data: |
project_entries.append(entry) |