从Java调用javascript函数

时间:2012-01-11 13:54:22

标签: java javascript android cordova

我使用PhoneGap开发应用程序。我得到了一个后台服务,并且是本地编码的(服务和手机间隙应用程序在同一个项目中)。不幸的是,我想从这个服务调用一个javascript函数。所以我在网上搜索并创建了一些有趣的东西:创建一个扩展插件的类并在其中进行一些处理。然后我发现了这个:

this.ctx.sendJavascript("myJavascriptFunction");

我使用此代码进行了测试,但发生了错误:

java.lang.NullPointerException

以下是我测试的方式:

class c = new class();
c.execute("myFunction",null,null);

在类c中,execute方法如下:

public PluginResult execute(String action, JSONArray args, String callbackId) {
if (action.equals("myFunction")){
    Log.d(TAG,"start actions to do");
    this.ctx.sendJavascript("nameOfFunctionToLaunch");
    Log.d(TAG,"end actions to do");
    return new PluginResult(PluginResult.Status.OK);
}
}

当应用开始时,我有第一个

Log.d(TAG,"start actions to do");

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

你不能调用object.loadUrl(“javascript:function();”);来自插件的插件并没有扩展Android的WebView。 要调用loadUrl,您必须将调用传递回扩展DroidGap的Home类。

在插件中,您可以定义

Home home = null;
Looper.prepare();
home = new Home();
home.somefunc();

并在somefunc调用中

super.loadUrl("javascript:function();");

答案 1 :(得分:0)

最后我找到了解决方案:实际上 NullPointerException ctx 上。 为了解决这个问题,我设置了我的对象 c 上下文值,如下所示:

c.setContext(use_An_Object_Of_Type_PhonegapActivity);

要获取对象,我会从此方法的AppActivity中获取它:

public class CloudPhoneAppActivity extends DroidGap {
private class NoScaleWebViewClient extends GapViewClient {

    public NoScaleWebViewClient(DroidGap ctx) {
        super(ctx);
        myApp.ctx = ctx;
    }

    public void onScaleChanged(WebView view, float oldScale, float newScale) {
        Log.d("NoScaleWebViewClient", "Scale changed: " + String.valueOf(oldScale) + " => " + String.valueOf(newScale));
    }
}
/** other stuff after**/ 
}

所以最后这里是解决方案:

class c = new class();
c.setContext(myApp.ctx);
c.execute("myFunction",null,null);

之前描述的执行方法没有变化。但要小心你如何调用javascript函数。

二万