android 上 webkit js 扩展之全局本地对象实现步骤

                   原文出处:    csdn lidp  http://blog.csdn.net/perfectpdl


最近在做广电项目,要求根据规范做浏览器端javascript扩展。android本身应用层提供了扩展方法,但是这可恶的规范导致应用层根本不可行,只好在webkit引擎里面做。。。


android 上编写 浏览器插件有三种方式,

1. app 层,通过android framwork 层提供的 封装扩展,优劣:简单,有局限性

2. 通过 NPAPI 方式, 在 webkit上 通过 NPAPI方式扩展,优劣:相对复杂,接口统一,方便移植到其他平台

3. 通过本地扩展方式,类似于js中对象的实现,在webcore 上实现,优劣:复杂,功能强大,移植性不好。

下面为android 上 webkit js 本地扩展方案中实现全局本地对象步骤 :

android上js引擎默认使用的是V8 ,比用 wekit本身提供的引擎麻烦一些。

1. 在 WebCore/page/ 目录下创建 helloObj.h helloObj.cpp helloObj.idl 
2. webcore 目录下 android.mk ,添加 page/helloObj.cpp
3. DOMWindow.cpp include "helloObj"
4. DOMWindow.cpp public 中添加 
 HelloObj* optionalHelloObj() const {return m_helloobj.get();}
 PassRefPtr<HelloObj> helloObj() const;
实现:
 PassRefPtr<HelloObj> DOMWindow::helloObj() const
{
if(!m_helloobj)
m_helloobj = HelloObj::create(m_frame);


return m_helloobj.get();
}


5.DOMWindow.h 中添加 class HelloObj;,private 部分添加 mutable RefPtr<HelloObj> m_helloobj;
6. DOMWindow.idl 中添加 readonly attribute HelloObj helloObj;
7. V8Index.h 中 添加 V(HELLOOBJ, HelloObj)
8. V8Index.cpp 中添加 #include "V8HelloObj.h"
9. Android.derived.v8bindings.mk中添加 $(intermediates)/bindings/V8HelloObj.h \
10. DOMWindow.cpp 中的clear函数添加
        if(m_helloobj)
m_helloobj->disconnectFrame();
m_helloobj = 0;




11. DerivedSourcesAllInOne.cpp 中添加 #include "bindings/V8HelloObj.cpp"

评论 2 您还未登录,请先 登录 后发表或查看评论
DuktapeJava 是针对 Android 平台封装的 Duktape  JavaScript 引擎实现Javascript 和 Java的无缝调用。 初始化DuktapeEngnine   @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); duktapeEngine = new DuktapeEngine(); duktapeEngine.put("activity",this); duktapeEngine.execute(AssetScript.toScript(getBaseContext(), "duk.js")); duktapeEngine.call("activityListener", "onCreate", savedInstanceState); } @Override protected void onDestroy() { if (duktapeEngine != null) { duktapeEngine.destory(); duktapeEngine = null; } super.onDestroy(); }   duk.js javascript 代码示例   importClass("com.furture.react.R") importClass("android.view.View.OnClickListener") importClass("android.widget.Toast") importClass("java.lang.Runnable") var activityListener = {}; activityListener.onCreate = function(){ print("activity onCreate onJavaScript"); activity.setContentView(R.layout.activity_duk) button1 = activity.findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener(function(){ Toast.makeText(activity, "Button1 Clicked", Toast.LENGTH_SHORT).show(); var intent = new Intent(activity, "com.furture.react.activity.DetailActivity"); activity.startActivity(intent); })); button2 = activity.findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener({ onClick:function(){ Toast.makeText(activity, "Button2 Clicked", Toast.LENGTH_SHORT).show(); } })); } activityListener.onStart = function(){ print("activity onStart"); } activityListener.onResume = function(){ print("activity onResume"); } activityListener.onPause = function(){ print("activity onPause"); } activityListener.onStop = function(){ print("activity onStop"); } activityListener.finish = function(){ print("activity finish" num); }   Java 和 Javascript 的无缝调用 javascript 调用java方法示例: importClass

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

voipmaker

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值