aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@google.com>2013-12-04 01:24:49 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-12-04 01:24:50 +0000
commit39aa53c42ed944e08db1e69ad557756eb84a36ad (patch)
treef768becf4a13dd287f20d0915572d978e0b8cb91
parent260a78f1e975b117a71fcc4b287198cb38d44293 (diff)
parentc4f572d8dd9664c63a04f48a99b79acfb9513de9 (diff)
downloadbuild-39aa53c42ed944e08db1e69ad557756eb84a36ad.tar.gz
Merge "Renderscript NDK mode support."
-rw-r--r--builder-model/src/main/java/com/android/builder/model/BuildType.java4
-rw-r--r--builder-model/src/main/java/com/android/builder/model/NdkConfig.java3
-rw-r--r--builder-model/src/main/java/com/android/builder/model/ProductFlavor.java16
-rw-r--r--builder/src/main/java/com/android/builder/AndroidBuilder.java2
-rw-r--r--builder/src/main/java/com/android/builder/DefaultProductFlavor.java19
-rw-r--r--builder/src/main/java/com/android/builder/VariantConfiguration.java4
-rw-r--r--builder/src/main/java/com/android/builder/internal/MergedNdkConfig.java (renamed from builder/src/main/java/com/android/builder/internal/NdkConfigImpl.java)3
-rw-r--r--builder/src/main/java/com/android/builder/internal/compiler/RenderScriptProcessor.java8
-rw-r--r--gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java4
-rw-r--r--gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java4
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy38
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java1
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy4
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java8
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy40
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/tasks/RenderscriptCompile.groovy4
-rw-r--r--tests/ndkRsHelloCompute/Android.mk31
-rw-r--r--tests/ndkRsHelloCompute/build.gradle43
-rw-r--r--tests/ndkRsHelloCompute/libhellocomputendk/Android.mk33
-rw-r--r--tests/ndkRsHelloCompute/src/main/AndroidManifest.xml30
-rw-r--r--tests/ndkRsHelloCompute/src/main/java/com/example/android/rs/hellocomputendk/HelloComputeNDK.java59
-rw-r--r--tests/ndkRsHelloCompute/src/main/jni/helloComputeNDK.cpp59
-rw-r--r--tests/ndkRsHelloCompute/src/main/res/drawable/data.jpgbin0 -> 76367 bytes
-rw-r--r--tests/ndkRsHelloCompute/src/main/res/layout/main.xml31
-rw-r--r--tests/ndkRsHelloCompute/src/main/rs/mono.rs28
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
new file mode 100644
index 0000000..81a87b1
--- /dev/null
+++ b/tests/ndkRsHelloCompute/src/main/res/drawable/data.jpg
Binary files differ
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);
+}
+