JS怎样调用Android本地原生方法
发布时间:2025-05-20 11:52:29 发布人:远客网络
一、JS怎样调用Android本地原生方法
在android中调用本地js文件里的方法并得到返回值其方法如下:
Android中内置了WebKit模块,而该模块的Java层视图类就是WebView,所有需要使用Web浏览器功能的Android都需要创建该视图类对象显示和处理请求的网络资源。目前WebKit支持Http、Https、Ftp和JavaScript请求。下面是在Android中调用JavaScript方法以及如何在js中调用本地方法。
1、在Assets下放一个简单的html文件jstest.html
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01//EN""">
<meta name="viewport" content="width=device-width, target-densitydpi=device-dpi"/>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
myjs.showMsg('hello in android!');
<span>测试js使用</span>
<button id='btntest' onclick='showMsgInAndroid()'>调用android方法</button>
<?xml version="1.0" encoding="utf-8"?>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/btn_showmsg"/>
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="调用html中js方法"/>
3、然后是Activity,MainActivity.java
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
public class MainActivity extends Activity{
private Handler mHandler= new Handler();
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mWebView=(WebView) findViewById(R.id.wv_test);
btnShowInfo=(Button) findViewById(R.id.btn_showmsg);
mWebView.getSettings().setBuiltInZoomControls(true);
//内容的渲染需要webviewChromClient去实现,设置webviewChromClient基类,解决js中alert不弹出的问题和其他内容渲染问题
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.getSettings().setJavaScriptEnabled(true);
//把js绑定到全局的myjs上,myjs的作用域是全局的,初始化后可随处使用
mWebView.addJavascriptInterface(js,"myjs");
mWebView.loadUrl("");
btnShowInfo.setOnClickListener(new OnClickListener(){
mWebView.loadUrl("javascript:showMsg()");
4、最后是绑定全局js的类JSKit.java
import com.harold.jstest.MainActivity;
public JSKit(MainActivity context){
public void showMsg(String msg){
Toast.makeText(ma, msg, Toast.LENGTH_SHORT).show();
例子比较简单,代码里都加了注释,这里就不多说了,本示例用的本地的html,如果访问网络中的网页,别忘记在AndroidManifest.xml中加权限
<uses-permission android:name="android.permission.INTERNET"/>
二、在Android上怎样实现JAVA和JS交互
其实webview加载资源的速度并不慢,但是如果资源多了,当然就很慢。图片、css、js、html这些资源每个大概需要10-200ms,一般都是30ms就ok了。不过webview是必须等到全部资源都完成加载,才会进行渲染的,所以加载的速度很重要!从Google上我们了解到,webview加载页面的顺序是:先加载html,然后从里面解析出css、js文件和页面上的图片资源进行加载。如果webkit的缓存里面有,就不加载。加载完这些资源之后,就进行css的渲染和js的执行。Css的渲染一般不需要很长时间,几十毫秒就ok。关键是js的执行,如果用了jQuery,则执行起来需要5-6秒。而在这段时间,如果不在webview里设置背景,网页部分是白色的,很难看。这是一个很糟糕的用户体验。所以#欧#柏泰#克建议如果用网页布局程序,最好别用那些庞大的js框架。最好使用原生的js写业务脚本,以提升加载速度,改善用户体验。
在Android上怎样实现JAVA和JS交互呢?Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过addJavas criptInterface方法,可以将Java的类注册进webkit,给网页上的js进行调用,而且还可以通过loadUrl方法是给webkit传递一个URL,供浏览器来进行解析,实现Java和js交互。
要想运行网页上的js脚本,webview必须设置支持Javas cript。
1mWebview.getSettings().setJavas criptEnabled(true);
然后是设置webview要加载的网页:
web的网页:webView.loadUrl("");
本地的网页:webView.loadUrl("");//本地的存放在:assets文件夹中
webview做完基本的初始化后我们还要要给它,加进一个回调的代理类Javas criptInterface,并给它一个调用的名称:ncp
1mWebView.addJavas criptInterface(new Javas criptInterface(),"ncp");
Javas criptInterface可以是一个普通的Java类,类实现的方法,均可被js回调:
final class Javas criptInterface{
public void callOnJs2(String mode){
Java要调用js的方法,只需知道js的方法名称即可:
1mWebView.loadUrl("javas cript:onSaveCallback()");
document.getElementById('btn_1').addEventListener('click', onBtnClick, false);
var _int_value= window.ncp.callOnJs();
alert("get int from java:"+ _int_value);
window.ncp.callOnJs2("click");
1.Java调用 js里面的函数,速度并不令人满意,大概一次一两百毫秒吧,如果要做交互性很强的事情,这种速度会让人疯掉的。而反过来就不一样了, js去调 java的方法,速度很快,基本上 40-50毫秒一次。所以尽量用 js调用 java方法,而不是 java去调用 js函数。
2.Java调用 js的函数,没有返回值,而 Js调用 java方法,可以有返回值。返回值可以是基本类型、字符串,也可以是对象。如果是字符串,有个很讨厌的问题,第 3点我会讲的。如果是对象,这个对象会被转换为 js的对象,直接可以访问里面的方法。但是我不推荐 java返回给 js的是对象,除非是必须。因为 js收到 java返回的对象,会产生一些交换对象,而如果这些对象的数量增加到了 500或 600以上,程序就会出问题。所以尽量返回基本数据类型或者字符串。
3.Js调用 Java的方法,返回值如果是字符串,你会发现这个字符串是 native的,不能对它进行一些修改操作,比如想对它 substr,取不到。怎么解决呢?转成 locale的。使用 toLocaleString()函数就可以了。不过这个函数的速度并不快,转化的字符串如果很多,将会很耗费时间。
三、如何在android平台上使用js直接调用Java方法
在Cocos2d-js 3.0beta中加入了一个新特性,在Android平台上我们可以通过反射直接在js中调用java的静态方法。它的使用方法很简单:
1 var o= jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)
在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回值。下面介绍的类名和方法签名可能会有一点奇怪,但是Java的规范就是如此的。
参数中的类名必须是包含Java包路径的完整类名,例如我们在org.cocos2dx.javascript这个包下面写了一个Test类:
123456789101112 package org.cocos2dx.javascript;public class Test{ public static void hello(String msg){ System.out.println(msg);} public static int sum(int a, int b){ return a+ b;} public static int sum(int a){ return a+ 2;}}
那么这个Test类的完整类名应该是org/cocos2dx/javascript/Test,注意这里必须是斜线/,而不是在Java代码中我们习惯的点。
方法名很简单,就是方法本来的名字,例如sum方法的名字就是sum。
方法签名稍微有一点复杂,最简单的方法签名是()V,它表示一个没有参数没有返回值的方法。其他一些例子:
(I)V表示参数为一个int,没有返回值的方法;
(I)I表示参数为一个int,返回值为int的方法;
(IF)Z表示参数为一个int和一个float,返回值为boolean的方法;
现在有一些理解了吧,括号内的符号表示参数类型,括号后面的符号表示返回值类型。因为Java是允许函数重载的,可以有多个方法名相同但是参数返回值不同的方法,方法签名正是用来帮助区分这些相同名字的方法的。
目前Cocos2d-js中支持的Java类型签名有下面4种: