js混淆算法 java_JS与JAVA互调的使用与打包混淆问题

JS与AndroidWebView互相调用,达到各种辅助的效果。

首先JAVA(Android)调用JS,怎么调用?有什么用处?

然后JS调用JAVA呢?下面给出一些浅析。

首先贴上JS代码中的function(方法):

function submit (){

var msg=document.getElementById("text_msg").value;

//实现调用的语句

Android.onSubmit(msg);

}

function add(){

document.getElementById("text_num").value++;

var num=document.getElementById("text_num").value;

//实现调用的语句

Android.onSubmitNum(num);

}

function dec(){

document.getElementById("text_num").value--;

var num=document.getElementById("text_num").value;

//实现调用的语句

Android.onSubmitNum(num);

}

function returnNum( num){

var num= Android.getAndroidNum();

document.getElementById("text_num").value=num;

}

function returnMsg( ){

var msg= Android.getAndroidMsg();

document.getElementById("text_msg").value=msg;

}

在互调之前要做的就是设置WebView支持JS

webSettings.setJavaScriptEnabled(true);

这行必须要有的,

然后就是互调的问题了,先看看JAVA调用JS:

这个其实很简单,首先该页面展示WebView,WebView有个loadUrl的API,那么就可以利用这个来加载,

比如我们调用文章前面给出的JS方法我们就可以

webView.loadUrl("javascrip:returnNum");

webView.loadUrl("javascrip:returnMsg");

这样我们就完成了,

使用场景:比如服务端想通过JS返回给我们一些参数或者数据,那么我们完全可以通过这样来接受到这些数据(这是比较高级点的)

正常的就是你想要本地对页面上面进行一些操作,那么这样就能完全达到你的要求了。

下面就是比较复杂一点JS调用JAVA了: 这个调用可以有好几种方式,不过总结起来就是一个@JavaScriptInterface接口的灵活运用, 可以直接在Android中程序中写入 @JavascriptInterface     public void JStoJAVA() {         //需要实现的功能     } 然后再JS里面就可以在上面实现调用语句的位置写上xxx.JStoJAVA(); 这里做个详细的解释吧,程序里面如果是这套的话xxx可以是任何不为空的字符(建议使用英文) 然后是后面参数也可以加入String型的(C端是可以接收的,如果是很多的话,建议使用JSON转成字符串传递) 我举个例子吧, @JavascriptInterface     public void JStoJAVA(String s) {         //需要实现的功能 String ss = s;//这个ss就可以拿到Android程序中随意使用了,其实也就实现了服务端传数据给C端     } //这是服务端调用代码 xxx.JStoJAVA(s);//s就是服务端传输的数据 这种唯一性很差,但是多出调用就好用了(假如很多个WebView都需要调用,xxx就区分不开了) 下面给出一种唯一性比较好的: webView.addJavascriptInterface(new JStoJAVA(), "Android"); //是在Activity中内部类(后面会解释为什么用内部类) public class JStoJAVA{ //javascript to java methods @JavaScriptInterface public void onSubmit(String s){ //JS调用了Android方法,并且C端接收到了数据 } @JavaScriptInterface public void onSubmitNum(String s){ //JS调用了Android方法,并且C端接收到了数据 } } } 这种就是上面JSfunction中所使用的调用方法了, 即:Android.onSubmit(msg); 然后还有一种就是直接添加,不使用内部类。 下面说一下我是用内部类的原因吧,这个其实主要跟打包混淆有关系,JS互调还有一个难点就是打包完了, 如果开启混淆,不处理的话,服务端就调不起来你的代码了,所以这些就不能混淆了,那么怎么写混淆了, 百度上面也有各种各样的,我说说我的吧,首先如果写第一种的换可以这样写混淆: -keepclassmembers class * extends android.app.Activity {    public void JStoJAVA(参数自己看看吧); } -keepattributes *Annotation* -keepattributes *JavascriptInterface* 第二种内部类混淆方法:(保持内部类不被混淆,里面的方法自然就可以了) -keep public class 包名.Activity名字$JS投JAVA {*;} -keepattributes *Annotation* -keepattributes *JavascriptInterface* 第三种我也不会,尝试了网上的方法都不行,也不知道为什么。 求高手指教一下,新手入门,不是太懂,见谅,谢谢! 先写到这里吧,有什么讨论的、指正的请联系邮箱:jsmeli@163.com.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以使用WebView中JavaScript与Android中Java方法。 想要实现这个功能,需要使用到Android中的WebView的addJavascriptInterface方法。这个方法可以将Java对象暴露给JavaScript代码,JavaScript代码就可以用这个对象的方法,实现JavaJavaScript的通。 具体步骤如下: 1. 在Java代码中创建一个类,这个类中包含需要暴露给JavaScript的方法。 2. 使用WebView的addJavascriptInterface方法将这个Java类对象暴露给JavaScript。 3. 在JavaScript代码中,使用window对象来访问这个Java对象,即可用其中的方法。 具体的实现可以参考下面的代码示例: Java代码: ```java public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } ``` 在Activity中使用addJavascriptInterface方法将Java对象暴露给JavaScript: ```java WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android"); ``` JavaScript代码中通过window对象访问Java对象: ```javascript function showToast() { Android.showToast("Hello World!"); } ``` 注意,addJavascriptInterface方法需要在主线程中用,否则可能会出现安全问题。另外,在使用JavaScriptJava方法时,需要添加@JavascriptInterface注解,以确保安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值