A library for running JavaScript in Android apps.

Overview

JsEvaluator library for running JavaScript in Android apps

JitPack

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 allprojects/repositories section of your project build.gradle file. For example:
allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}
  1. Add compile 'com.github.evgenyneu:js-evaluator-for-android:v5.0.0' into dependencies section of your module build.gradle file. For example:
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // Keep you existing dependencies here
    implementation 'com.github.evgenyneu:js-evaluator-for-android:v5.0.0'
}

For less information, see Gradle/Maven setup instructions on JsEvaluator jitpack.io page.

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.

Comments
  • Gradle build and maven, downloadable jar

    Gradle build and maven, downloadable jar

    Great library, mind adding to maven central repository? a downloadable jar would be handy too. Also, I can't find a build script(gradle or maven) in the project, so i assume that you are using ADT's build feature. I would recommend migrating to maven/gradle if possible.

    Thanks

    opened by tom91136 13
  • subsequent registered of evaluation is not executed

    subsequent registered of evaluation is not executed

    If i request com.evgenii.jsevaluator.JsEvaluator#evaluate(java.lang.String, com.evgenii.jsevaluator.interfaces.JsCallback)

    few times in short time distance (when previous is not evaluated) the previously scheduled evaluation is not delivered as success or failure

    probably reason: loadUrl method of webView is cancelling previously page that is opening in: com.evgenii.jsevaluator.WebViewWrapper#loadJavaScript

    opened by clydzik 12
  • ReferenceError

    ReferenceError

    Getting this error when I use your js evaluator:

    I/chromium﹕ [INFO:CONSOLE(1)] "Uncaught ReferenceError: yourFunc is not defined", source: data:text/html;charset=utf-8;base64,PHNjcmlwdD5ldmdlbmlpSnNFdmFsdWF0b3IucmV0dXJuUmVzdWx0VG9KYXZhKGV2YWwoJ19fX19qc2JyaWRnZV9yZWFkXzE0MjA5NzkyNDE1OTdfNDg2KCk7JyksIDIpOzwvc2NyaXB0Pg==(1)

    Android: 5.0.1 Nexus 5

    opened by MustafaFerhan 11
  • Wrong output

    Wrong output

    I try with this eval:

    eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1I k=1G 1o();1I j=1G 1o();k[2]="d://1.g.e.a/-1V/25/26/24/i/h-1W.b?f=0";k[12]="o://p.c.q/n/s/m-l-t-r/1/c.a-P.b";k[19]="o://p.c.q/n/s/m-l-t-r/1/c.a-1O.b";k[3]="d://1.g.e.a/-1X/1Y/1Z/1K/i/h-1u.b?f=0";k[7]="o://p.c.q/n/s/m-l-t-r/1/c.a-1L.b";k[17]="d://1.g.e.a/-1b/1c/R/1k/i/h-1l.b?f=0";k[13]="d://1.g.e.a/-Z/1a/X/W/i/h-S.b?f=0";k[5]="d://1.g.e.a/-1p/1q/1r/1y/i/h-1z.b?f=0";k[16]="o://p.c.q/n/s/m-l-t-r/1/c.a-1h.b";k[8]="d://1.g.e.a/-J/I/H/G/i/h-K.b?f=0";k[1]="d://1.g.e.a/-1F/1E/1A/1B-1C/i/h-1D.b?f=0";k[22]="o://p.c.q/n/s/m-l-t-r/1/c.a-U.b";k[11]="o://p.c.q/n/s/m-l-t-r/1/c.a-1H.b";k[0]="o://p.c.q/n/s/m-l-t-r/1/c.a-1n.b";k[18]="d://1.g.e.a/-1d/1e/1f/1g/i/h-1m.b?f=0";k[20]="d://1.g.e.a/-w/x/E/F/i/h-M.b?f=0";k[15]="o://p.c.q/n/s/m-l-t-r/1/c.a-1M.b";k[21]="d://1.g.e.a/-O-Q/1j/1J/1R/i/h-1S.b?f=0";k[14]="d://1.g.e.a/-1i/V/T/Y/i/h-1N.b?f=0";k[23]="d://1.g.e.a/-A/C/D/z-y-u/i/h-v.b?f=0";k[4]="o://p.c.q/n/s/m-l-t-r/1/c.a-1U.b";k[10]="d://1.g.e.a/-1v/1w/1x/1t/i/h-1s.b?f=0";k[6]="o://p.c.q/n/s/m-l-t-r/1/c.a-1Q.b";k[9]="d://1.g.e.a/-1P/1T/B/L/i/h-N.b?f=0";j[4]="o://p.c.q/n/s/m-l-t-r/1/c.a-1U.b";j[0]="o://p.c.q/n/s/m-l-t-r/1/c.a-1n.b";j[9]="d://1.g.e.a/-1P/1T/B/L/i/h-N.b?f=0";j[12]="o://p.c.q/n/s/m-l-t-r/1/c.a-P.b";j[14]="d://1.g.e.a/-1i/V/T/Y/i/h-1N.b?f=0";j[13]="d://1.g.e.a/-Z/1a/X/W/i/h-S.b?f=0";j[22]="o://p.c.q/n/s/m-l-t-r/1/c.a-U.b";j[17]="d://1.g.e.a/-1b/1c/R/1k/i/h-1l.b?f=0";j[16]="o://p.c.q/n/s/m-l-t-r/1/c.a-1h.b";j[18]="d://1.g.e.a/-1d/1e/1f/1g/i/h-1m.b?f=0";j[23]="d://1.g.e.a/-A/C/D/z-y-u/i/h-v.b?f=0";j[20]="d://1.g.e.a/-w/x/E/F/i/h-M.b?f=0";j[8]="d://1.g.e.a/-J/I/H/G/i/h-K.b?f=0";j[21]="d://1.g.e.a/-O-Q/1j/1J/1R/i/h-1S.b?f=0";j[6]="o://p.c.q/n/s/m-l-t-r/1/c.a-1Q.b";j[7]="o://p.c.q/n/s/m-l-t-r/1/c.a-1L.b";j[15]="o://p.c.q/n/s/m-l-t-r/1/c.a-1M.b";j[19]="o://p.c.q/n/s/m-l-t-r/1/c.a-1O.b";j[2]="d://1.g.e.a/-1V/25/26/24/i/h-1W.b?f=0";j[3]="d://1.g.e.a/-1X/1Y/1Z/1K/i/h-1u.b?f=0";j[10]="d://1.g.e.a/-1v/1w/1x/1t/i/h-1s.b?f=0";j[5]="d://1.g.e.a/-1p/1q/1r/1y/i/h-1z.b?f=0";j[11]="o://p.c.q/n/s/m-l-t-r/1/c.a-1H.b";j[1]="d://1.g.e.a/-1F/1E/1A/1B-1C/i/h-1D.b?f=0";',62,131,'||||||||||com|jpg|truyentranh8|https|blogspot|imgmax|bp|TT8|s0|lstImagesVIP|lstImages|doi|hoan|u2|http|manga|net|duyen|Htri|tinh|4s|zzzkhunggio|oTcWB5IICnU|WG4iIQzY6iI|dE4I|A80|7McjvzgCT9E|AAAAAAAAayw|WG4iJX04U5I|AAAAAAAAazQ|AAAAAAAAazI|F9sH6L_VR30|o8syNjzsIfE|AAAAAAAAays|WG4iFvpXkwI|TWXYlIwN5Dk|008|LgDvNGvjurw|021|009|SmNKAMmRM|012||AAAAAAAAazA|013|AAAAAAAAay8|023|WG4iHKtv32I|Z6E2N6NUFBw|AAAAAAAAay4|vADOhUnUiso|ZXWhsekCA3I|||||||||||WG4iGxztlpI|Ap2CFL63QFM|WG4iH4px29I|OPz_3DkYMbw|WG4iIN93jPI|AAAAAAAAazE|kiVrL5ZAA88|017|Y320ZdJuPY0|WG4iI6BxACI|rvUmYbgD7tY|018|019|000|Array|k9mlgNJHuVM|WG4iFOfgwSI|AAAAAAAAayo|010|cAh2IcoOs1w|003|QAUotTf3k_g|WG4iGNX1BSI|AAAAAAAAay0|4ALYh18UjZs|005|AAAAAAAAayk|ti|AmvOgJgc|001|WG4iEHZAciI|ZWjJefQ8IIs|new|011|var|AAAAAAAAazM|WFKexhZFTaY|007|016|015|020|z0XlG81dBaA|006|H9MwQe5nVTQ|022|WG4iFkTVrgI|004|GBBdDaauQbU|002|xq5EoDrXHT4|WG4iEKasRWI|AAAAAAAAayg|||||tOuTbRIUrFI|WG4iDqdT73I|AAAAAAAAayc'.split('|'),0,{}))

    Only last element of ouput array return.

    opened by mdtuyen 10
  • method onResult just didn't callback

    method onResult just didn't callback

    I have a md5.js file in assets/md5.js,and there is a js function which i want to call from my Activity,but I didn't get the callback,Instead I got an error:
    "Uncaught SyntaxError: Unexpected token ILLEGAL", source: data:text/html;charset=utf-8;base64,PHNjcmlwdD5ldmdlbmlpSnNFdmFsdWF0b3IucmV0dXJuUmVzdWx0VG9KYXZhKGV2YWwoJ2Z1bmN0aW9uIG1kNWpzKHBhc3MsIGNvZGUsIHVpbikgew1cbnZhciBJID0gaGV4Y2hhcjJiaW4obWQ1KHBhc3MpKTsNXG52YXIgSCA9IG1kNShJICsgdWluKTsNXG52YXIgRyA9IG1kNShIICsgY29kZS50b1VwcGVyQ2FzZSgpKTsNXG5yZXR1cm4gRw1cbn0NXG4NXG5mdW5jdGlvbiBjaGt5em0ob2JqKSB7DVxuIGlmKG9iai52YWx1ZSE9XCdcJykgew1cbiAgIHZhciBzPW1kNShtZDUob2JqLnZhbHVlLnRvVXBwZXJDYXNlKCkpLnN1YnN0cmluZygwLDMwKS50b1VwcGVyQ2FzZSgpK1wnMTA4MTJcJykuc3Vic3RyaW5nKDAsMzApLnRvVXGNvcmVfbWQ1KH... Below is my code:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        init();
        new GetCodeThread().start();
        mJsEvaluator = new JsEvaluator(this);
        md5("r27e");
    }
    
    private void md5(String str) {
        String jscode = Utils.loadJs("md5.js", this);
        Log.e("ghui","jscode: " + jscode);
        mJsEvaluator.callFunction(jscode, new JsCallback() {
            @Override
            public void onResult(String s) {
                Log.e("ghui", "-------------------------after md5:" + s);
                //no callback
            }
        }, "chkyzm", str);
    }
    

    and the chkyzm is a function in md5.js

    Thanks very much in advance!!!

    opened by graycreate 8
  • JsEvaluator mResultCallback is growing and do not realease previous callbacks

    JsEvaluator mResultCallback is growing and do not realease previous callbacks

    i realized that this list is holding results callbacks (probably for matching request/response interface) but as self is not maintained after finish (success or failure) com.evgenii.jsevaluator.JsEvaluator#mResultCallbacks

    the workaround is to use jsEvaluator.getResultCallbacks().remove();

    but this is not documented and a bit awkward

    opened by clydzik 7
  • Expose internal Webview for destroying

    Expose internal Webview for destroying

    Would it be possible to expose the internal WebView object being used to run the evaluations?

    This is needed so that I can successfully destroy and clean up the Webview instances accordingly - http://stackoverflow.com/questions/17418503/destroy-webview-in-android, otherwise they're kept in memory even after the JsEvaluator is destroyed.

    Better yet, is it possible to add a destroy() method as well as exposing the Webview instance thus giving users more flexibility about what can/what can't be done with the JavaScript.

    opened by autovalue 6
  • Urgent: Gradle Build failed

    Urgent: Gradle Build failed

    If I try to install via gradle I get an error that gradle can not resolve the package via jitpack.

    So I looked at https://jitpack.io/com/github/evgenyneu/js-evaluator-for-android/v1.0.2/build.log

    To see following build error:

    Start: Fri Oct 16 02:17:52 UTC 2015 Git: v1.0.2 commit 8222e4efb8e9dbab358625e63074d3c6ddb3b913 Merge: 2183e19 a0bf9c6 Author: Evgenii Neumerzhitckii Date: Thu Jun 25 21:45:47 2015 +1000

    Merge branch 'master' of github.com:evgenyneu/js-evaluator-for-android
    

    submodule status: Run gradle build Gradle build script Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 Downloading https://services.gradle.org/distributions/gradle-2.2.1-all.zip .................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. Unzipping /home/jitpack/.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcnnqlfbq9klf8imrndn/gradle-2.2.1-all.zip to /home/jitpack/.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcnnqlfbq9klf8imrndn Set executable permissions for: /home/jitpack/.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcnnqlfbq9klf8imrndn/gradle-2.2.1/bin/gradle


    Gradle 2.2.1

    Build time: 2014-11-24 09:45:35 UTC Build number: none Revision: 6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a

    Groovy: 2.3.6 Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013 JVM: 1.7.0_76 (Oracle Corporation 24.76-b04) OS: Linux 3.13.0-36-generic amd64

    Getting a list of gradle tasks Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

    FAILURE: Build failed with an exception.

    • What went wrong: A problem occurred configuring project ':app'.

      failed to find Build Tools revision 23.0.0 rc2

    • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

    FAILURE: Build failed with an exception.

    • What went wrong: A problem occurred configuring project ':app'.

      failed to find Build Tools revision 23.0.0 rc2

    • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Gradle 'install' task not found. Please add the 'maven' or 'android-maven' plugin. See the documentation and examples: https://jitpack.io/docs/

    Found android library build file ./jsevaluator/build.gradle Running: ./gradlew clean -Pgroup=com.github.evgenyneu -Pversion=v1.0.2 install Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 Download https://jcenter.bintray.com/com/github/dcendents/android-maven-plugin/1.2/android-maven-plugin-1.2.pom Download https://jcenter.bintray.com/com/github/dcendents/android-maven-plugin/1.2/android-maven-plugin-1.2.jar Gradle version 2.2.1

    FAILURE: Build failed with an exception.

    • What went wrong: A problem occurred configuring project ':app'.

      failed to find Build Tools revision 23.0.0 rc2

    • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

    BUILD FAILED

    Total time: 6.82 secs No build artifacts found

    opened by sittingbool 5
  • Percent-encoding is not escaped correctly.

    Percent-encoding is not escaped correctly.

    Hi

    I am currently working on ComplexAlarm which evolves to get opening_hours.js running on Android which currently does not work: [INFO:CONSOLE(1)] "Uncaught SyntaxError: Unexpected token ILLEGAL", source: about:blank (1)

    The mini example is: "if(5%12)true;" It seems that "%12" gets interpreted as percent-encoding. I was able to find a workaround which is to replace "%" with "% ". With this workaround opening_hours.js now seems to run successfully with js-evaluator-for-android :+1:

    opened by ypid 5
  • where to find functions ?

    where to find functions ?

    Hi. Love the plugin, but where can i find which mat functions can i use ? I used Math.sqrt() and it works bc i tried from someones video tutorial and want too see whic other fuctions work and possibly add some.

    opened by crvenizg 4
  • How to add custom JavascriptInterface?

    How to add custom JavascriptInterface?

    jsEvaluator.getWebView().addJavascriptInterface(new MyJsInterface(), "myInterface");
    jsEvaluator.evaluate("myInterface.someMethod('string')", new JsCallback() { ...
    

    I add my JavascriptInterface, but callback onError :

    TypeError: undefined is not a function
    
    opened by veesong 4
  • request

    request

    please tell me someone has already used this Lib for a App that can handle this pseudo code:

    var a1=numberfield(namestring, digits); var a2=numberfield(namestring, digits); var b=numberfield(namestring, digits); var result=textfield(whatever); function calc(){ if(a2>0)return (a1+a2)/2+b; else return something; }

    well, not exacly that code. i know this is not the right place, please be gracious to me.

    opened by theduskin 0
  • do it async value

    do it async value

    I tried 87234 times to return value with CountDownLatch but i cant. please update the source, make it async and returnable script.

    CountDownLatch and others not working with javascript handler in your project sources. you should add the handler to return values. i dont wanna use the webView.evaluateJavascript()

    opened by kodlayanzi 0
  • Is callFunction working with async function in js?

    Is callFunction working with async function in js?

    I am trying to pass data to javascript and return the value using return await sth in that async function. But I am getting the undefined value

    for the context, I am using a chatbot library

    var bot = new RiveScript({utf8: true});
    
    async function getRsReply(code,user,input) {
        bot.stream(code);
        bot.sortReplies();
        var result = await bot.reply(user, input);
        return result;
    }
    

    the result in the JsCallback returned undefined

    opened by BennyKok 13
Owner
Evgenii Neumerzhitckii
🐋🦔🐢🐝wow
Evgenii Neumerzhitckii
JavaScript evaluation from kotlin common code for android & iOS

Mobile Kotlin javascript This is a Kotlin MultiPlatform library that allows you to run JavaScript code from common Kotlin code Table of Contents Featu

IceRock Development 14 Aug 29, 2022
Lambda-snake.kt - Snake Game Implementation for Web using Kotlin programming language compiled for Javascript

Projeto da disciplina de Linguagem de Programação Funcional 2021.1 (jan/2022) ??

Alex Candido 3 Jan 10, 2022
Uproot-JS - Extract JavaScript files from burp suite project with ease

Extract JavaScript files from burp suite project with ease. Disclaimer I am not

Dexter0us 50 Aug 8, 2022
Kotlin library for creating long running connections using MQTT protocol

About Courier Courier is a kotlin library for creating long running connections using MQTT protocol. Long running connection is a persistent connectio

Gojek 92 Dec 23, 2022
The Action helps you to send a message to a queue on a RabbitMQ running Server

Rabbit Sender Action This Action helps you to send a message to a queue on a RabbitMQ running Server. Inputs Arg Default Description RABBIT_USERNAME g

Quique Ferraris 12 Dec 1, 2022
Repository of a multi-platform application running the same Compose source code on all platforms

Compose multiplatform demo demo.mov Using the same compose user interface (UI) from android on all principal platforms ?? ?? App Features This is a si

David Coronel 18 Dec 16, 2022
Android project setup files when developing apps from scratch. The codebase uses lates jetpack libraries and MVVM repository architecture for setting up high performance apps

Android architecture app Includes the following Android Respository architecture MVVM Jepack libraries Carousel view Kotlin Kotlin Flow and Livedata P

null 2 Mar 31, 2022
Library to use Kotlin Coroutines from Swift code in KMP apps

KMP-NativeCoroutines A library to use Kotlin Coroutines from Swift code in KMP apps. Flows Kotlin Create an extension property to expose the Flow as a

Rick Clephas 508 Jan 3, 2023
Cross-platform framework for building truly native mobile apps with Java or Kotlin. Write Once Run Anywhere support for iOS, Android, Desktop & Web.

Codename One - Cross Platform Native Apps with Java or Kotlin Codename One is a mobile first cross platform environment for Java and Kotlin developers

Codename One 1.4k Jan 9, 2023
This lib implements the most common CoroutineScopes used in Android apps.

AndroidCoroutineScopes Starting from 0.26.0 release we should define a scope for new coroutines (docs). To avoid this boilerplate code I've created th

Adriel Café 15 Oct 3, 2022
Udacity Free course: Developing Android Apps with Kotlin

Room - SleepQualityTracker app This is the toy app for Lesson 6 of the Android App Development in Kotlin course on Udacity. SleepQualityTracker The Sl

Reinaldo  Salazar 0 Nov 6, 2021
Simple, fast, efficient logging facade for Android apps

µlog Simple, fast, and efficient logging facade for Android apps. Inspired by Timber and Logcat. Features Lazy message evaluation Pluggable backends (

Danny Lin 9 Oct 21, 2022
Runtime Mobile Security (RMS) 📱🔥 - is a powerful web interface that helps you to manipulate Android and iOS Apps at Runtime

Runtime Mobile Security (RMS) ?? ?? by @mobilesecurity_ Runtime Mobile Security (RMS), powered by FRIDA, is a powerful web interface that helps you to

Mobile Security 2k Dec 20, 2022
D-KMP Architecture official sample: it uses a shared KMP ViewModel and Navigation for Compose and SwiftUI apps.

D-KMP architecture - official sample This is the official sample of the D-KMP architecture, presenting a simple master/detail app, for Android, iOS an

null 594 Jan 3, 2023
Reapp is everything you need to build amazing apps with React: a collection of packages that work together, our UI kit, and a CLI that scaffolds your app and includes a server and build system.

What is it? Reapp is everything you need to build amazing apps with React: a collection of packages that work together, our UI kit, and a CLI that sca

reapp 3.4k Nov 20, 2022
[Android Library] A SharedPreferences helper library to save and fetch the values easily.

Preference Helper A SharedPreferences helper library to save and fetch the values easily. Featured in Use in your project Add this to your module's bu

Naveen T P 13 Apr 4, 2020
Oratio Library for Android Studio helps you simplify your Android TTS codes

Oratio Oratio is a library for Android Studio. This library is useful to a number of developers who are currently making apps using android TTS(Text-T

Jacob Lim 1 Oct 28, 2021
Android Ptrace Inject for all ABIs and all APIs. Help you inject Shared Library on Android.

Android Ptrace Inject 中文可以参考我的注释内容进行理解 我写的注释相对来说比较全面了 How to build Make sure you have CMake and Ninja in your PATH Edit CMakeLists.txt. Set ANDROID_ND

SsageParuders 65 Dec 19, 2022
YouTube Player library for Android and Chromecast, stable and customizable.

android-youtube-player android-youtube-player is a stable and customizable open source YouTube player for Android. It provides a simple View that can

Pierfrancesco Soffritti 2.9k Jan 2, 2023