---
title: Android integration
description: Learn how to use Java Scoring Code on Android with little or no modifications. Supported only for Android 8.0 (API 26) or later.

---

# Android integration {: #android-integration }

It is possible to use Java Scoring Code on Android with little or no modifications.

!!! note
    Supported Android versions are 8.0 (API 26) or later.

## Using a single model {: #using-a-single-model }

Using a single model in an Android project is almost the same as using it in any Java project:

1. Copy the Scoring Code JAR file into the Android project in the directory `app/libs`.
2. Add the following lines to the `dependency` section in `app/build.gradle`:
    ```
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    annotationProcessor fileTree(include: ['*.jar'], dir: 'libs')
    ```
3. You can now use the model in the same way as the [Java API](quickstart-api#java-api-example).

## More complex use cases {: #more-complex-use-cases }

You must process the Scoring Code JARs to enable more complex functionality.
DataRobot provides a tool: `scoring-code-jar-tool` that will process one or more Scoring Code JAR files to be able to accomplish the following goals.
`scoring-code-jar-tool` is distributed as a JAR file and can be obtained <a target="_blank" href="https://mvnrepository.com/artifact/com.datarobot/scoring-code-jar-tool">here</a>.

### Using multiple models {: #using-multiple-models }

It is not possible to use more than one Scoring Code JAR in the same Android project.
Each Scoring Code JAR contains the same dependencies and Android does not allow multiple classes with the same fully qualified name.
To fix this, `scoring-code-jar-tool` can be used to take multiple input JAR files and merge them into a single JAR file with duplicate classes removed.

For example:

    `java -jar scoring-code-jar-tool.jar --output combined.jar model1.jar model2.jar`

### Dynamic loading of JARs {: #dynamic-loading-of-jars }

To dynamically load scoring code jars, they must be compiled into Dalvik Executable (DEX) format.
`scoring-code-jar-tool` can compile to dex using the `--dex` parameter.

For example:

    `java -jar scoring-code-jar-tool.jar --output combined.jar --dex /home/user/Android/Sdk/build-tools/29.0.3/dx model1.jar model2.jar`

The `--dex` parameter requires the path to the `dx` tool which is a part of the Android SDK.

#### Java example {: #java-example }

In this example, a model with id `5ebbeb5119916f739492a021` has been processed by `scoring-code-jar-tool` with the `--dex` argument to produce an output JAR called `model-dex.jar`.
For the sake of this example, the merged JAR file has been added as asset to the project.
It is not possible to get a filesystem path to assets which is why the asset is copied to a location in the filesystem before it is loaded.

```java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String filename = "model-dex.jar";

        File externalFile = new File(getExternalFilesDir(null), filename);
        try {
            copyAssetToFile(filename, externalFile);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        DexClassLoader loader = new DexClassLoader(externalFile.getAbsolutePath(), "", null, MainActivity.class.getClassLoader());
        IClassificationPredictor classificationPredictor = Predictors.getPredictor("5ebbeb5119916f739492a021", loader);
    }

    private void copyAssetToFile(String assetName, File dest) throws IOException {
        AssetManager assetManager = getAssets();

        try (InputStream in = assetManager.open(assetName)) {
            try (OutputStream out = new FileOutputStream(dest)) {
                byte[] buffer = new byte[1024];
                int read;
                while ((read = in.read(buffer)) != -1) {
                    out.write(buffer, 0, read);
                }
            }
        }
    }
}
```