• Stars
    star
    476
  • Rank 92,268 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 10 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A library for running JavaScript in Android apps.

JsEvaluator library for running JavaScript in Android apps

JsEvaluator may help you run JavaScript in an Android app and get the results. This is an alternative to evaluateJavascript method of the WebView. Supports Android version 4.0 (Ice Cream Sandwich) and newer.

Setup

There are two ways your can add JsEvaluator to your project:

  1. From a remote Maven repository.
  2. From a local .aar or .jar file.

1. Setup from Maven repository in Android Studio

  1. Add maven { url "https://jitpack.io" } into settings.gradle file, in dependencyResolutionManagement / repositories section. For example:
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url "https://jitpack.io" } // <----- Add this
    }
}
  1. Add implementation 'com.github.evgenyneu:js-evaluator-for-android:v6.0.0' into dependencies section of your module build.gradle file. For example:
dependencies {
    // ...
    implementation 'com.github.evgenyneu:js-evaluator-for-android:v6.0.0'
}

See Legacy setup instructions if you are using Gradle older than version 7.

2. Setup from local .aar file

Download jsevaluator-1.0.aar. You can also build it yourself into jsevaluator/build/outputs/aar/ directory in Android Studio with this command:

./gradlew :jsevaluator:aR

Add aar file to Android Studio project

To add JsEvaluator to your app in Android Studio:

  1. Copy the jsevaluator-1.0.aar to your app/libs folder.
  2. Add compile(name:'jsevaluator-1.0', ext:'aar') to dependencies block of your module build.gradle file.
dependencies {
    compile(name:'jsevaluator-1.0', ext:'aar')
}
  1. Add the following code to the allprojects/repositories block of your project build.gradle file.
allprojects {
    repositories {
        jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}

Add jar file to Eclipse project

  1. Unzip the jsevaluator-1.0.aar and get the classes.jar from it. You may want to rename it to jsevaluator.jar.
  2. Open properties for your app project.
  3. Select Libraries tab in Java Build Path.
  4. Click Add JARs... button and select the .jar file.
  5. In your project properties click Order and export tab.
  6. Tick the .jar file.

Usage

Create evaluator instance variable in your activity:

public class MainActivity extends AppCompatActivity {
    JsEvaluator jsEvaluator = new JsEvaluator(this);

this is a reference to your activity.

Evaluate JavaScript

jsEvaluator.evaluate("2 * 17", new JsCallback() {
  @Override
  public void onResult(String result) {
    // Process result here.
    // This method is called in the UI thread.
  }

  @Override
  public void onError(String errorMessage) {
    // Process JavaScript error here.
    // This method is called in the UI thread.
  }
});

Note: make sure to call evaluate method in UI thread.

Call a JavaScript function

jsEvaluator.callFunction("function myFunction(a, b, c, d) { return 'result'; }",
  new JsCallback() {

  @Override
  public void onResult(String result) {
    // Process result here.
    // This method is called in the UI thread.
  }

  @Override
  public void onError(String errorMessage) {
    // Process JavaScript error here.
    // This method is called in the UI thread.
  }
}, "myFunction", "parameter 1", "parameter 2", 912, 101.3);

Any number of string, int or double parameters can be supplied.

Note: make sure to call callFunction method in UI thread.

JavaScript is evaluated asynchronously

JavaScript is evaluated asynchronously without blocking UI thread. Result is returned in the UI thread. It is required to call evaluate and callFunction in UI thread.

JavaScript is evaluated in new context

Each time the JavaScript is evaluated in the new context. It can not access the result of a previous evaluation. Please concatenate all your JavaScript to one string and evaluate it in one go.

For example, if you need to load jQuery libary and then use it:

String jQuery = "/*! jQuery JavaScript Library v2.1.1 ...";
jsEvaluator.evaluate(jQuery + "; $.isNumeric(123)", new JsCallback() { ...

Advanced functionality

Destroying the evaluator

Calling the destroy() method will destroy the Web View used by JsEvaluator and clear the memory. JsEvaluator can not be used after it is destroyed.

jsEvaluator.destroy();

Accessing the WebView

Here is how to get the instance to the web view used by the JsEvaluator.

WebView webView = jsEvaluator.getWebView();

Known limitations

This library is suitable for evaluating only small amounts of JavaScript within hundreds of KB. It has been reported that the library can not evaluate a megabyte of JavaScript. If you run into similar problems you can try ericwlange/AndroidJSCore library instead.

How it works

Behind the scenes it creates a WebView and feeds it JavaScript code for evaluation:

mWebView = new WebView(context);
String javascript = "<script>myObj.returnResult('Hello World')</script>";
byte[] data = javascript.getBytes("UTF-8");
String base64 = Base64.encodeToString(data, Base64.DEFAULT);
mWebView.loadUrl("data:text/html;charset=utf-8;base64," + base64);

The result of evaluation is sent back into Android activity:

public class JavaScriptInterface {
   public void returnResult(String result) {
      // result from JavaScript
   }
}

mWebView.addJavascriptInterface(new JavaScriptInterface(), "myObj");

Catching JavaScript errors

This library catches errors by wrapping the whole JavaScript code in a try-catch block. The errors are then returned to Java in the onError method of the callback object.

jsEvaluator.evaluate("4 * octapod", new JsCallback() {
   @Override
   public void onResult(String result) { }

   @Override
   public void onError(String errorMessage) {
      // errorMessage => "ReferenceError: octapod is not defined"
   }
});

Please note that this method only catches runtime JavaScript errors, like undefined variables or properties. It will not, however, catch errors resulted from malformed JavaScript code, like missing a } bracket.

Using with ProGuard

If you are using ProGuard (minifyEnabled true) you can add these rules to your proguard-rules.pro file.

# js-evaluator-for-android
-keepattributes JavascriptInterface
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

You will most likely not need to modify your proguard file because JSEvaluator uses consumer proguard rules.

Tests

Tests are located in app module of this project. The app can be run for manual testing as well.

JsEvaluator library for Android screenshot 1

JsEvaluator library for Android screenshot 2

Or run as Android JUnit Test for unit testing.

Android versions tested:

  • 4.0.3 (Ice Cream Sandwich)
  • 4.1.2, 4.2.2, 4.3 (Jelly Bean)
  • 4.4.2 (KitKat)
  • 5.0, 5.1 (Lollipop)
  • 6.0 (Marshmallow)
  • 8.0 (Oreo)

Thanks 👍

Feedback is welcome

If you have any issues or need help please do not hesitate to create an issue ticket.

More Repositories

1

keychain-swift

Helper functions for saving text in Keychain securely for iOS, OS X, tvOS and watchOS.
Swift
2,577
star
2

Cosmos

A star rating control for iOS/tvOS written in Swift
Swift
2,119
star
3

Dodo

A message bar for iOS written in Swift.
Swift
875
star
4

SigmaSwiftStatistics

A collection of functions for statistical calculation written in Swift.
Swift
682
star
5

swift-badge

A badge view for iOS/tvOS written in Swift
Swift
390
star
6

moa

An image download extension of the image view written in Swift for iOS, tvOS and macOS.
Swift
333
star
7

Auk

An image slideshow for iOS written in Swift.
Swift
277
star
8

center-vfl

Centering a view in a super view with Visual Format Language using Auto Layout in iOS/Swift
Swift
227
star
9

ios-imagescroll-swift

iOS demo of using image view inside a scroll view with auto layout in Swift
Swift
128
star
10

UnderKeyboard

An iOS libary for moving content from under the keyboard.
Swift
128
star
11

SpringAnimationCALayer

A helper function for animating CALayer with spring effect in Swift
Swift
117
star
12

Cephalopod

A sound fader for AVAudioPlayer written in Swift for iOS, tvOS and macOS.
Swift
112
star
13

bubble-button-animation-ios-swift

Demo iOS app showing button animation
Swift
66
star
14

bounce-button-animation-android

A demo Android app that shows how to animate a button with spring/bounce effect.
Java
61
star
15

ios-imagescroll

iOS: example of using image view inside a scroll view with auto layout, written in Obective-C.
Objective-C
59
star
16

angular-markdown-preview

AngularJS module for markdown textarea with live HTML preview.
JavaScript
35
star
17

ios-javascriptcore-demo

iOS demo: running javascript function from ObjectiveC using JavaScriptCore framework
Objective-C
32
star
18

Glyptodon

A 'no content' message overlay for iOS written in Swift.
Swift
31
star
19

Scrollable

An iOS control that makes content scroll vertically.
Swift
20
star
20

aes-crypto-web

Web app for encrypting text messages http://aescrypto.com
JavaScript
20
star
21

JsonSwiftson

A JSON parser with concise API written in Swift.
Swift
14
star
22

aes-crypto-android

Android app for encrypting text messages http://aescrypto.com
JavaScript
12
star
23

two_galaxies

A web simulation of two interacting galaxies
JavaScript
10
star
24

walk-to-circle-ios

An iOS app for those who like walking
Swift
9
star
25

trigonometric_identities_latex

Trigonometric identities in LaTeX format
TeX
8
star
26

greeter-android

Sample code for "Testing activity in Android Studio" tutorial.
Java
6
star
27

aes-text-encryption-ios

iOS app for encrypting text messages http://aescrypto.com
JavaScript
5
star
28

sharing-keychain-demo

A demo iOS app showing how to access a shared keychain item
Swift
4
star
29

ios-core-location-battery-meter

iOS demo app for measuring power consumption of location services
Swift
4
star
30

core-location-tester-ios

Demo iOS app for testing Core Location accuracy
Swift
3
star
31

SneakPeekScroll

An iOS demo app showing a scroll view with images and lets you see a portion of the next and previous images
Swift
3
star
32

evgenii.com

My personal web site at http://evgenii.com
JavaScript
3
star
33

FortranFromPython

An example of running a Fortran code from Python
Python
3
star
34

siba

Simple backup and restore utility
Ruby
2
star
35

tarpan

Python functions for analysing cmdspanpy output
Python
2
star
36

image_compressor_c

An image compressor program written in C that uses singular value expansion
C
2
star
37

docker-rails-fig-sample

A sample Rails/Postgres app that shows how to use Docker and Fig
Ruby
2
star
38

oct_viewer

Demo of the OCT viewer
JavaScript
1
star
39

siba-destination-ftp

FTP destination for SIBA backup and restore utility.
Ruby
1
star
40

watch-kit-app-demo

Demo WatchKit app from the video tutorial.
Swift
1
star
41

walk-to-circle-android

An Android app for those who like walking
Java
1
star
42

distance_from_parallax

A Python program that plots distances measured from simulated parallaxes.
Python
1
star
43

covid19

A naive Stan model of confirmed COVID-19 cases that uses logistic function.
Python
1
star
44

siba-source-mysql

Backup and restore MySQL database. This is an extension to SIBA utility.
Ruby
1
star
45

ai_teaches_me_ml

This is my logbook from my interactive lessons where ChatGPT teaches me ML
Jupyter Notebook
1
star
46

siba-destination-aws-s3

Backup to Amazon S3 cloud storage. This is an extension to SIBA backup and restore utility.
Ruby
1
star
47

SixBouncingButtons

An example of creating six buttons with bounce effect in Android
Java
1
star
48

siba-source-mongo-db

MongoDb backup and restore plugin for SIBA
Ruby
1
star
49

ASP3162

Codes for ASP3162 labs
Fortran
1
star
50

WatchKitParentAppBenchmark

A demo app showing how to communicate between watchOS and iOS using the sendMessage method of watch connectivity framework.
Swift
1
star