diff options
author | Xavier Ducrohet <xav@google.com> | 2013-12-04 01:24:49 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-12-04 01:24:50 +0000 |
commit | 39aa53c42ed944e08db1e69ad557756eb84a36ad (patch) | |
tree | f768becf4a13dd287f20d0915572d978e0b8cb91 | |
parent | 260a78f1e975b117a71fcc4b287198cb38d44293 (diff) | |
parent | c4f572d8dd9664c63a04f48a99b79acfb9513de9 (diff) | |
download | build-39aa53c42ed944e08db1e69ad557756eb84a36ad.tar.gz |
Merge "Renderscript NDK mode support."
25 files changed, 452 insertions, 24 deletions
diff --git a/builder-model/src/main/java/com/android/builder/model/BuildType.java b/builder-model/src/main/java/com/android/builder/model/BuildType.java index 9bdc6dc..c8cf61e 100644 --- a/builder-model/src/main/java/com/android/builder/model/BuildType.java +++ b/builder-model/src/main/java/com/android/builder/model/BuildType.java @@ -98,6 +98,10 @@ public interface BuildType extends BaseConfig { */ boolean isZipAlign(); + /** + * Returns the NDK configuration. + * @return the ndk config. + */ @Nullable NdkConfig getNdkConfig(); } diff --git a/builder-model/src/main/java/com/android/builder/model/NdkConfig.java b/builder-model/src/main/java/com/android/builder/model/NdkConfig.java index c750001..25056c7 100644 --- a/builder-model/src/main/java/com/android/builder/model/NdkConfig.java +++ b/builder-model/src/main/java/com/android/builder/model/NdkConfig.java @@ -49,6 +49,9 @@ public interface NdkConfig { @Nullable public Collection<String> getAbiFilters(); + /** + * The APP_STL value + */ @Nullable public String getStl(); } diff --git a/builder-model/src/main/java/com/android/builder/model/ProductFlavor.java b/builder-model/src/main/java/com/android/builder/model/ProductFlavor.java index 6f8d4af..fef921d 100644 --- a/builder-model/src/main/java/com/android/builder/model/ProductFlavor.java +++ b/builder-model/src/main/java/com/android/builder/model/ProductFlavor.java @@ -89,9 +89,21 @@ public interface ProductFlavor extends BaseConfig { */ int getRenderscriptTargetApi(); + /** + * Returns whether the renderscript code should be compiled in support mode to + * make it compatible with older versions of Android. + * + * @return true if support mode is enabled. + */ boolean getRenderscriptSupportMode(); /** + * Returns whether the renderscript code should be compiled to generate C/C++ bindings. + * @return true for C/C++ generation, false for Java + */ + boolean getRenderscriptNdkMode(); + + /** * Returns the test package name. This is only the value set on this product flavor. * To get the final value, use {@link Variant#getTestArtifactInfo()} and * {@link AndroidArtifact#getPackageName()} @@ -126,6 +138,10 @@ public interface ProductFlavor extends BaseConfig { @Nullable Boolean getTestFunctionalTest(); + /** + * Returns the NDK configuration. + * @return the ndk config. + */ @Nullable NdkConfig getNdkConfig(); } diff --git a/builder/src/main/java/com/android/builder/AndroidBuilder.java b/builder/src/main/java/com/android/builder/AndroidBuilder.java index f39e75c..77cc807 100644 --- a/builder/src/main/java/com/android/builder/AndroidBuilder.java +++ b/builder/src/main/java/com/android/builder/AndroidBuilder.java @@ -868,6 +868,7 @@ public class AndroidBuilder { int targetApi, boolean debugBuild, int optimLevel, + boolean ndkMode, boolean supportMode, @Nullable Set<String> abiFilters) throws IOException, InterruptedException, LoggedErrorException { @@ -897,6 +898,7 @@ public class AndroidBuilder { targetApi, debugBuild, optimLevel, + ndkMode, supportMode, abiFilters); processor.build(mCmdLineRunner); diff --git a/builder/src/main/java/com/android/builder/DefaultProductFlavor.java b/builder/src/main/java/com/android/builder/DefaultProductFlavor.java index 603f0d3..7a7b757 100644 --- a/builder/src/main/java/com/android/builder/DefaultProductFlavor.java +++ b/builder/src/main/java/com/android/builder/DefaultProductFlavor.java @@ -38,6 +38,7 @@ public class DefaultProductFlavor extends BaseConfigImpl implements ProductFlavo private int mTargetSdkVersion = -1; private int mRenderscriptTargetApi = -1; private Boolean mRenderscriptSupportMode; + private Boolean mRenderscriptNdkMode; private int mVersionCode = -1; private String mVersionName = null; private String mPackageName = null; @@ -159,6 +160,16 @@ public class DefaultProductFlavor extends BaseConfigImpl implements ProductFlavo mRenderscriptSupportMode = renderscriptSupportMode; } + @Override + public boolean getRenderscriptNdkMode() { + // default is false + return mRenderscriptNdkMode != null && mRenderscriptNdkMode.booleanValue(); + } + + public void setRenderscriptNdkMode(boolean renderscriptNdkMode) { + mRenderscriptNdkMode = renderscriptNdkMode; + } + @NonNull public ProductFlavor setTestPackageName(String testPackageName) { mTestPackageName = testPackageName; @@ -239,6 +250,8 @@ public class DefaultProductFlavor extends BaseConfigImpl implements ProductFlavo base.mRenderscriptTargetApi); flavor.mRenderscriptSupportMode = chooseBoolean(mRenderscriptSupportMode, base.mRenderscriptSupportMode); + flavor.mRenderscriptNdkMode = chooseBoolean(mRenderscriptNdkMode, + base.mRenderscriptNdkMode); flavor.mVersionCode = chooseInt(mVersionCode, base.mVersionCode); flavor.mVersionName = chooseString(mVersionName, base.mVersionName); @@ -290,6 +303,10 @@ public class DefaultProductFlavor extends BaseConfigImpl implements ProductFlavo !mRenderscriptSupportMode.equals(that.mRenderscriptSupportMode) : that.mRenderscriptSupportMode != null) return false; + if (mRenderscriptNdkMode != null ? + !mRenderscriptNdkMode.equals(that.mRenderscriptNdkMode) : + that.mRenderscriptNdkMode != null) + return false; if (mVersionCode != that.mVersionCode) return false; if (mPackageName != null ? !mPackageName.equals(that.mPackageName) : @@ -328,6 +345,7 @@ public class DefaultProductFlavor extends BaseConfigImpl implements ProductFlavo result = 31 * result + mTargetSdkVersion; result = 31 * result + mRenderscriptTargetApi; result = 31 * result + (mRenderscriptSupportMode != null ? mRenderscriptSupportMode.hashCode() : 0); + result = 31 * result + (mRenderscriptNdkMode != null ? mRenderscriptNdkMode.hashCode() : 0); result = 31 * result + mVersionCode; result = 31 * result + (mVersionName != null ? mVersionName.hashCode() : 0); result = 31 * result + (mPackageName != null ? mPackageName.hashCode() : 0); @@ -351,6 +369,7 @@ public class DefaultProductFlavor extends BaseConfigImpl implements ProductFlavo .add("targetSdkVersion", mTargetSdkVersion) .add("renderscriptTargetApi", mRenderscriptTargetApi) .add("renderscriptSupportMode", mRenderscriptSupportMode) + .add("renderscriptNdkMode", mRenderscriptNdkMode) .add("versionCode", mVersionCode) .add("versionName", mVersionName) .add("packageName", mPackageName) diff --git a/builder/src/main/java/com/android/builder/VariantConfiguration.java b/builder/src/main/java/com/android/builder/VariantConfiguration.java index 1491405..80df454 100644 --- a/builder/src/main/java/com/android/builder/VariantConfiguration.java +++ b/builder/src/main/java/com/android/builder/VariantConfiguration.java @@ -22,7 +22,7 @@ import com.android.annotations.VisibleForTesting; import com.android.builder.dependency.DependencyContainer; import com.android.builder.dependency.JarDependency; import com.android.builder.dependency.LibraryDependency; -import com.android.builder.internal.NdkConfigImpl; +import com.android.builder.internal.MergedNdkConfig; import com.android.builder.internal.StringHelper; import com.android.builder.model.ClassField; import com.android.builder.model.NdkConfig; @@ -105,7 +105,7 @@ public class VariantConfiguration implements TestData { private LibraryDependency mOutput; private DefaultProductFlavor mMergedFlavor; - private final NdkConfigImpl mMergedNdkConfig = new NdkConfigImpl(); + private final MergedNdkConfig mMergedNdkConfig = new MergedNdkConfig(); private final Set<JarDependency> mJars = Sets.newHashSet(); diff --git a/builder/src/main/java/com/android/builder/internal/NdkConfigImpl.java b/builder/src/main/java/com/android/builder/internal/MergedNdkConfig.java index b455a0a..bd83e99 100644 --- a/builder/src/main/java/com/android/builder/internal/NdkConfigImpl.java +++ b/builder/src/main/java/com/android/builder/internal/MergedNdkConfig.java @@ -24,8 +24,9 @@ import com.google.common.collect.Sets; import java.util.Set; /** + * Implementation of NdkConfig used to merge multiple configs together. */ -public class NdkConfigImpl implements NdkConfig { +public class MergedNdkConfig implements NdkConfig { private String moduleName; private String cFlags; diff --git a/builder/src/main/java/com/android/builder/internal/compiler/RenderScriptProcessor.java b/builder/src/main/java/com/android/builder/internal/compiler/RenderScriptProcessor.java index 80096e9..9b28743 100644 --- a/builder/src/main/java/com/android/builder/internal/compiler/RenderScriptProcessor.java +++ b/builder/src/main/java/com/android/builder/internal/compiler/RenderScriptProcessor.java @@ -103,6 +103,8 @@ public class RenderScriptProcessor { private final int mOptimLevel; + private final boolean mNdkMode; + private final boolean mSupportMode; private final Set<String> mAbiFilters; @@ -120,6 +122,7 @@ public class RenderScriptProcessor { int targetApi, boolean debugBuild, int optimLevel, + boolean ndkMode, boolean supportMode, @Nullable Set<String> abiFilters) { mSourceFolders = sourceFolders; @@ -132,6 +135,7 @@ public class RenderScriptProcessor { mTargetApi = targetApi; mDebugBuild = debugBuild; mOptimLevel = optimLevel; + mNdkMode = ndkMode; mSupportMode = supportMode; mAbiFilters = abiFilters; @@ -237,6 +241,10 @@ public class RenderScriptProcessor { command.add("-p"); command.add(mSourceOutputDir.getAbsolutePath()); + if (mNdkMode) { + command.add("-reflect-c++"); + } + // res output command.add("-o"); command.add(rawFolder.getAbsolutePath()); diff --git a/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java b/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java index 5372005..18e3277 100644 --- a/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java +++ b/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java @@ -37,8 +37,8 @@ public class AutomatedBuildTest extends BuildTest { "aidl", "api", "applibtest", "assets", "attrOrder", "basic", "dependencies", "dependencyChecker", "flavored", "flavorlib", "flavors", "genFolderApi", "libProguardJarDep", "libProguardLibDep", "libTestDep", "libsTest", "localJars", - "migrated", "multiproject", "multires", "ndkSanAngeles", "overlay1", "overlay2", - "pkgOverride", "proguard", "proguardLib", "renderscript", "renderscriptInLib", + "migrated", "multiproject", "multires", "ndkSanAngeles", "ndkJniLib", "overlay1", + "overlay2", "pkgOverride", "proguard", "proguardLib", "renderscript", "renderscriptInLib", "renderscriptMultiSrc", "rsSupportMode", "sameNamedLibs", "tictactoe" /*, "autorepo"*/ }; diff --git a/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java b/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java index e025033..0e410f1 100644 --- a/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java +++ b/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java @@ -40,8 +40,8 @@ public class DeviceTest extends BuildTest { private static final String[] sBuiltProjects = new String[] { "api", "assets", "applibtest", "attrOrder", "basic", "dependencies", "flavored", "flavorlib", "flavors", "libProguardJarDep", "libProguardLibDep", "libTestDep", "libsTest", - "migrated", "multires", "overlay1", "overlay2", "pkgOverride", "proguard", "proguardLib", - "sameNamedLibs" + "migrated", "multires", "ndkJniLib", "overlay1", "overlay2", "pkgOverride", "proguard", + "proguardLib", "sameNamedLibs" }; public static Test suite() { diff --git a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy index 471b581..3c206ed 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -452,13 +452,21 @@ public abstract class BasePlugin { RenderscriptCompile) variantData.renderscriptCompileTask = renderscriptTask - variantData.sourceGenTask.dependsOn renderscriptTask + ProductFlavor mergedFlavor = config.mergedFlavor + boolean ndkMode = mergedFlavor.renderscriptNdkMode + + // only put this dependency if rs will generate Java code + if (!ndkMode) { + variantData.sourceGenTask.dependsOn renderscriptTask + } + renderscriptTask.dependsOn variantData.prepareDependenciesTask renderscriptTask.plugin = this renderscriptTask.variant = variantData - renderscriptTask.targetApi = config.mergedFlavor.renderscriptTargetApi - renderscriptTask.supportMode = config.mergedFlavor.renderscriptSupportMode + renderscriptTask.targetApi = mergedFlavor.renderscriptTargetApi + renderscriptTask.supportMode = mergedFlavor.renderscriptSupportMode + renderscriptTask.ndkMode = ndkMode renderscriptTask.debugBuild = config.buildType.renderscriptDebugBuild renderscriptTask.optimLevel = config.buildType.renderscriptOptimLevel @@ -727,7 +735,9 @@ public abstract class BasePlugin { sourceList.add({ variantData.processResourcesTask.sourceOutputDir }) sourceList.add({ variantData.generateBuildConfigTask.sourceOutputDir }) sourceList.add({ variantData.aidlCompileTask.sourceOutputDir }) - sourceList.add({ variantData.renderscriptCompileTask.sourceOutputDir }) + if (!config.mergedFlavor.renderscriptNdkMode) { + sourceList.add({ variantData.renderscriptCompileTask.sourceOutputDir }) + } if (config.getType() != VariantConfiguration.Type.TEST) { sourceList.add(((AndroidSourceSet) config.buildTypeSourceSet).java) @@ -798,7 +808,21 @@ public abstract class BasePlugin { VariantConfiguration variantConfig = variantData.variantConfiguration - ndkCompile.conventionMapping.sourceFolders = { variantConfig.jniSourceList } + if (variantConfig.mergedFlavor.renderscriptNdkMode) { + ndkCompile.ndkRenderScriptMode = true + ndkCompile.dependsOn variantData.renderscriptCompileTask + } else { + ndkCompile.ndkRenderScriptMode = false + } + + ndkCompile.conventionMapping.sourceFolders = { + List<File> sourceList = variantConfig.jniSourceList + if (variantConfig.mergedFlavor.renderscriptNdkMode) { + sourceList.add(variantData.renderscriptCompileTask.sourceOutputDir) + } + + return sourceList + } ndkCompile.conventionMapping.generatedMakefile = { project.file("$project.buildDir/ndk/${variantData.variantConfiguration.dirName}/Android.mk") @@ -1059,7 +1083,7 @@ public abstract class BasePlugin { // first the connected one. def connectedTask = createDeviceProviderInstrumentTestTask( hasFlavors ? - "${connectedRootName}${baseVariantData.variantConfiguration.fullName}" : connectedRootName, + "${connectedRootName}${baseVariantData.variantConfiguration.fullName.capitalize()}" : connectedRootName, "Installs and runs the tests for Build '${baseVariantData.variantConfiguration.fullName}' on connected devices.", isLibraryTest ? DeviceProviderInstrumentTestLibraryTask : @@ -1077,7 +1101,7 @@ public abstract class BasePlugin { for (DeviceProvider deviceProvider : providers) { DefaultTask providerTask = createDeviceProviderInstrumentTestTask( hasFlavors ? - "${deviceProvider.name}${INSTRUMENT_TEST.capitalize()}${baseVariantData.variantConfiguration.fullName}" : + "${deviceProvider.name}${INSTRUMENT_TEST.capitalize()}${baseVariantData.variantConfiguration.fullName.capitalize()}" : "${deviceProvider.name}${INSTRUMENT_TEST.capitalize()}", "Installs and runs the tests for Build '${baseVariantData.variantConfiguration.fullName}' using Provider '${deviceProvider.name.capitalize()}'.", isLibraryTest ? diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java index 87b6dcd..6b708e5 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java @@ -29,6 +29,7 @@ import java.util.Collections; import java.util.Set; /** + * Implementation of NdkConfig to be used in the gradle DSL. */ public class NdkConfigDsl implements NdkConfig, Serializable { private static final long serialVersionUID = 1L; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy index 9bf6c46..41ec14f 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy @@ -275,8 +275,10 @@ public class ModelBuilder implements ToolingModelBuilder { folders.add(variantData.processResourcesTask.sourceOutputDir) folders.add(variantData.aidlCompileTask.sourceOutputDir) - folders.add(variantData.renderscriptCompileTask.sourceOutputDir) folders.add(variantData.generateBuildConfigTask.sourceOutputDir) + if (!variantData.variantConfiguration.mergedFlavor.renderscriptNdkMode) { + folders.add(variantData.renderscriptCompileTask.sourceOutputDir) + } List<File> extraFolders = variantData.extraGeneratedSourceFolders if (extraFolders != null) { diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java index cc7aad6..f00bd24 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java @@ -39,6 +39,7 @@ class ProductFlavorImpl implements ProductFlavor, Serializable { private int mTargetSdkVersion = -1; private int mRenderscriptTargetApi = -1; private boolean mRenderscriptSupportMode = false; + private boolean mRenderscriptNdkMode = false; private int mVersionCode = -1; private String mVersionName = null; private String mPackageName = null; @@ -56,6 +57,7 @@ class ProductFlavorImpl implements ProductFlavor, Serializable { clonedFlavor.mTargetSdkVersion = productFlavor.getTargetSdkVersion(); clonedFlavor.mRenderscriptTargetApi = productFlavor.getRenderscriptTargetApi(); clonedFlavor.mRenderscriptSupportMode = productFlavor.getRenderscriptSupportMode(); + clonedFlavor.mRenderscriptNdkMode = productFlavor.getRenderscriptNdkMode(); clonedFlavor.mVersionCode = productFlavor.getVersionCode(); clonedFlavor.mVersionName = productFlavor.getVersionName(); @@ -116,6 +118,11 @@ class ProductFlavorImpl implements ProductFlavor, Serializable { return mRenderscriptSupportMode; } + @Override + public boolean getRenderscriptNdkMode() { + return mRenderscriptNdkMode; + } + @Nullable @Override public String getTestPackageName() { @@ -173,6 +180,7 @@ class ProductFlavorImpl implements ProductFlavor, Serializable { ", mTargetSdkVersion=" + mTargetSdkVersion + ", mRenderscriptTargetApi=" + mRenderscriptTargetApi + ", mRenderscriptSupportMode=" + mRenderscriptSupportMode + + ", mRenderscriptNdkMode=" + mRenderscriptNdkMode + ", mVersionCode=" + mVersionCode + ", mVersionName='" + mVersionName + '\'' + ", mPackageName='" + mPackageName + '\'' + diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy index 4526371..eba8d72 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy @@ -15,7 +15,6 @@ */ package com.android.build.gradle.tasks - import com.android.annotations.NonNull import com.android.build.gradle.internal.tasks.NdkTask import com.android.builder.model.NdkConfig @@ -51,6 +50,9 @@ class NdkCompile extends NdkTask { @OutputDirectory File objFolder + @Input + boolean ndkRenderScriptMode + @InputFiles FileTree getSource() { FileTree src = null @@ -117,26 +119,38 @@ class NdkCompile extends NdkTask { StringBuilder sb = new StringBuilder() sb.append( - "LOCAL_PATH := \$(call my-dir)\n" + - "include \$(CLEAR_VARS)\n\n") + 'LOCAL_PATH := $(call my-dir)\n' + + 'include \$(CLEAR_VARS)\n\n') - sb.append("LOCAL_MODULE := ").append(ndk.moduleName != null ? ndk.moduleName : project.name).append('\n') + sb.append('LOCAL_MODULE := ').append(ndk.moduleName != null ? ndk.moduleName : project.name).append('\n') if (ndk.cFlags != null) { - sb.append("LOCAL_CFLAGS := ").append(ndk.cFlags).append('\n') + sb.append('LOCAL_CFLAGS := ').append(ndk.cFlags).append('\n') } + List<String> fullLdlibs = Lists.newArrayList() if (ndk.ldLibs != null) { + fullLdlibs.addAll(ndk.ldLibs) + } + if (getNdkRenderScriptMode()) { + fullLdlibs.add("dl") + fullLdlibs.add("log") + fullLdlibs.add("jnigraphics") + fullLdlibs.add("RScpp_static") + fullLdlibs.add("cutils") + } + + if (!fullLdlibs.isEmpty()) { sb.append('LOCAL_LDLIBS := \\\n') - for (String lib : ndk.ldLibs) { + for (String lib : fullLdlibs) { sb.append('\t-l') .append(lib).append(' \\\n') } sb.append('\n') } - sb.append("LOCAL_SRC_FILES := \\\n") + sb.append('LOCAL_SRC_FILES := \\\n') for (File sourceFile : sourceFiles) { - sb.append('\t').append(sourceFile.absolutePath).append(" \\\n") + sb.append('\t').append(sourceFile.absolutePath).append(' \\\n') } sb.append('\n') @@ -144,8 +158,16 @@ class NdkCompile extends NdkTask { sb.append("LOCAL_C_INCLUDES += ${sourceFolder.absolutePath}\n") } + if (getNdkRenderScriptMode()) { + sb.append('LOCAL_LDFLAGS += -L$(call host-path,$(TARGET_C_INCLUDES)/../lib/rs)\n') + + sb.append('LOCAL_C_INCLUDES += $(TARGET_C_INCLUDES)/rs/cpp\n') + sb.append('LOCAL_C_INCLUDES += $(TARGET_C_INCLUDES)/rs\n') + sb.append('LOCAL_C_INCLUDES += $(TARGET_OBJS)/$(LOCAL_MODULE)\n') + } + sb.append( - "\ninclude \$(BUILD_SHARED_LIBRARY)\n") + '\ninclude \$(BUILD_SHARED_LIBRARY)\n') Files.write(sb.toString(), makefile, Charsets.UTF_8) } diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/RenderscriptCompile.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/RenderscriptCompile.groovy index 17985fc..a5f7986 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/RenderscriptCompile.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/RenderscriptCompile.groovy @@ -61,6 +61,9 @@ public class RenderscriptCompile extends NdkTask { @Input boolean debugBuild + @Input + boolean ndkMode + @TaskAction void taskAction() { // this is full run (always), clean the previous outputs @@ -91,6 +94,7 @@ public class RenderscriptCompile extends NdkTask { getTargetApi(), getDebugBuild(), getOptimLevel(), + getNdkMode(), getSupportMode(), getNdkConfig()?.abiFilters) } diff --git a/tests/ndkRsHelloCompute/Android.mk b/tests/ndkRsHelloCompute/Android.mk new file mode 100644 index 0000000..5dbe19f --- /dev/null +++ b/tests/ndkRsHelloCompute/Android.mk @@ -0,0 +1,31 @@ +# +# Copyright (C) 2013 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-java-files-under, src) \ + $(call all-renderscript-files-under, src) + +LOCAL_PACKAGE_NAME := HelloComputeNDK +LOCAL_SDK_VERSION := 14 + +LOCAL_JNI_SHARED_LIBRARIES := libhellocomputendk + +include $(BUILD_PACKAGE) +include $(LOCAL_PATH)/libhellocomputendk/Android.mk
\ No newline at end of file diff --git a/tests/ndkRsHelloCompute/build.gradle b/tests/ndkRsHelloCompute/build.gradle new file mode 100644 index 0000000..65899ba --- /dev/null +++ b/tests/ndkRsHelloCompute/build.gradle @@ -0,0 +1,43 @@ +buildscript { + repositories { + maven { url '../../../../out/host/gradle/repo' } + } + dependencies { + classpath 'com.android.tools.build:gradle:0.7.0-SNAPSHOT' + } +} +apply plugin: 'android' + +android { + compileSdkVersion 19 + buildToolsVersion "19.0.1" + + defaultConfig { + renderscriptNdkMode true + ndk { + moduleName "libhellocomputendk" + stl "stlport_shared" + } + + } + + buildTypes.debug.jniDebugBuild true + + productFlavors { + x86 { + ndk { + abiFilter "x86" + } + } + arm { + ndk { + abiFilter "armeabi-v7a" + } + } + mips { + ndk { + abiFilter "mips" + } + } + } +}
\ No newline at end of file diff --git a/tests/ndkRsHelloCompute/libhellocomputendk/Android.mk b/tests/ndkRsHelloCompute/libhellocomputendk/Android.mk new file mode 100644 index 0000000..1c0e861 --- /dev/null +++ b/tests/ndkRsHelloCompute/libhellocomputendk/Android.mk @@ -0,0 +1,33 @@ +# Copyright (C) 2013 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# This is the shared library included by the JNI test app. +# +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) +LOCAL_CLANG := true + +LOCAL_MODULE := libhellocomputendk +LOCAL_MODULE_TAGS := optional +LOCAL_SRC_FILES := helloComputeNDK.cpp mono.rs + +LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) +LOCAL_C_INCLUDES += frameworks/rs/cpp +LOCAL_C_INCLUDES += frameworks/rs +LOCAL_C_INCLUDES += external/stlport/stlport bionic/ bionic/libstdc++/include + +LOCAL_SHARED_LIBRARIES := libdl liblog libjnigraphics +LOCAL_STATIC_LIBRARIES := libRScpp_static libstlport_static libcutils +include $(BUILD_SHARED_LIBRARY) diff --git a/tests/ndkRsHelloCompute/src/main/AndroidManifest.xml b/tests/ndkRsHelloCompute/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4db45e7 --- /dev/null +++ b/tests/ndkRsHelloCompute/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.rs.hellocomputendk"> + + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-sdk android:minSdkVersion="14" /> + <application android:label="HelloComputeNDK"> + <activity android:name="HelloComputeNDK"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tests/ndkRsHelloCompute/src/main/java/com/example/android/rs/hellocomputendk/HelloComputeNDK.java b/tests/ndkRsHelloCompute/src/main/java/com/example/android/rs/hellocomputendk/HelloComputeNDK.java new file mode 100644 index 0000000..aec6497 --- /dev/null +++ b/tests/ndkRsHelloCompute/src/main/java/com/example/android/rs/hellocomputendk/HelloComputeNDK.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.rs.hellocomputendk; + +import android.app.Activity; +import android.os.Bundle; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap; +import android.widget.ImageView; + +public class HelloComputeNDK extends Activity { + private Bitmap mBitmapIn; + private Bitmap mBitmapOut; + + static { + System.loadLibrary("hellocomputendk"); + } + + native void nativeMono(int X, int Y, Bitmap in, Bitmap out); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + mBitmapIn = loadBitmap(R.drawable.data); + mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(), + mBitmapIn.getConfig()); + + ImageView in = (ImageView) findViewById(R.id.displayin); + in.setImageBitmap(mBitmapIn); + + ImageView out = (ImageView) findViewById(R.id.displayout); + out.setImageBitmap(mBitmapOut); + + nativeMono(mBitmapIn.getWidth(), mBitmapIn.getHeight(), mBitmapIn, mBitmapOut); + + } + + private Bitmap loadBitmap(int resource) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inPreferredConfig = Bitmap.Config.ARGB_8888; + return BitmapFactory.decodeResource(getResources(), resource, options); + } +} diff --git a/tests/ndkRsHelloCompute/src/main/jni/helloComputeNDK.cpp b/tests/ndkRsHelloCompute/src/main/jni/helloComputeNDK.cpp new file mode 100644 index 0000000..6ed5589 --- /dev/null +++ b/tests/ndkRsHelloCompute/src/main/jni/helloComputeNDK.cpp @@ -0,0 +1,59 @@ +#include <jni.h> +#include <android/log.h> +#include <android/bitmap.h> + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#include <RenderScript.h> + +#include "ScriptC_mono.h" + +#define LOG_TAG "HelloComputeNDK" +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) + +using namespace android::RSC; + +extern "C" JNIEXPORT void JNICALL +Java_com_example_android_rs_hellocomputendk_HelloComputeNDK_nativeMono(JNIEnv * env, + jclass, + jint X, + jint Y, + jobject jbitmapIn, + jobject jbitmapOut + ) +{ + + void* inputPtr = NULL; + void* outputPtr = NULL; + + AndroidBitmap_lockPixels(env, jbitmapIn, &inputPtr); + AndroidBitmap_lockPixels(env, jbitmapOut, &outputPtr); + + sp<RS> rs = new RS(); + rs->init(); + + sp<const Element> e = Element::RGBA_8888(rs); + + sp<const Type> t = Type::create(rs, e, X, Y, 0); + + sp<Allocation> inputAlloc = Allocation::createTyped(rs, t, RS_ALLOCATION_MIPMAP_NONE, + RS_ALLOCATION_USAGE_SHARED | RS_ALLOCATION_USAGE_SCRIPT, + inputPtr); + sp<Allocation> outputAlloc = Allocation::createTyped(rs, t, RS_ALLOCATION_MIPMAP_NONE, + RS_ALLOCATION_USAGE_SHARED | RS_ALLOCATION_USAGE_SCRIPT, + outputPtr); + + + inputAlloc->copy2DRangeFrom(0, 0, X, Y, inputPtr); + ScriptC_mono* sc = new ScriptC_mono(rs); + sc->forEach_root(inputAlloc, outputAlloc); + outputAlloc->copy2DRangeTo(0, 0, X, Y, outputPtr); + + + AndroidBitmap_unlockPixels(env, jbitmapIn); + AndroidBitmap_unlockPixels(env, jbitmapOut); + +} diff --git a/tests/ndkRsHelloCompute/src/main/res/drawable/data.jpg b/tests/ndkRsHelloCompute/src/main/res/drawable/data.jpg Binary files differnew file mode 100644 index 0000000..81a87b1 --- /dev/null +++ b/tests/ndkRsHelloCompute/src/main/res/drawable/data.jpg diff --git a/tests/ndkRsHelloCompute/src/main/res/layout/main.xml b/tests/ndkRsHelloCompute/src/main/res/layout/main.xml new file mode 100644 index 0000000..7b2c76a --- /dev/null +++ b/tests/ndkRsHelloCompute/src/main/res/layout/main.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ImageView + android:id="@+id/displayin" + android:layout_width="320dip" + android:layout_height="266dip" /> + + <ImageView + android:id="@+id/displayout" + android:layout_width="320dip" + android:layout_height="266dip" /> + +</LinearLayout> diff --git a/tests/ndkRsHelloCompute/src/main/rs/mono.rs b/tests/ndkRsHelloCompute/src/main/rs/mono.rs new file mode 100644 index 0000000..efa5c72 --- /dev/null +++ b/tests/ndkRsHelloCompute/src/main/rs/mono.rs @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma version(1) +#pragma rs java_package_name(com.example.android.rs.hellocomputendk) + +const static float3 gMonoMult = {0.299f, 0.587f, 0.114f}; + +void root(const uchar4 *v_in, uchar4 *v_out) { + float4 f4 = rsUnpackColor8888(*v_in); + + float3 mono = dot(f4.rgb, gMonoMult); + *v_out = rsPackColorTo8888(mono); +} + |