stevewuxl
stevewuxl
  • 发布:2016-02-25 16:40
  • 更新:2016-03-19 13:06
  • 阅读:6251

关于importClass,对象怎么调用

分类:Native.js

看到importClass能直接使用java类,一阵欢喜,觉得websocket实现有望,结果,硬是没弄明白引入类后,类怎么掉用方法,以及类带有返回值的方法怎么调用及使用,还有带有参数的方法怎么调用(怎么传值)
如下:
var WebSocketFactory; //Java类
var WebSocketObj;//Java类
document.addEventListener( "plusready", function()
{
alert("Hello");
WebSocketFactory = plus.android.importClass("com.yusys.socket.WebSocketFactory");
WebSocketObj = plus.android.importClass("com.yusys.socket.WebSocket");
}, true);

起先调用WebSocketFactory来实例化对象:
var WebSocketObj = function(url) {
alert("必须要到这里来呀!");
var webSocketFactory = new WebSocketFactory(); //--这步就出错了
alert(webSocketFactory);
this.socket = webSocketFactory.getInstance(url);
alert("22222222222");
alert(this.socket);
// store in registry
if(this.socket) {
WebSocketObj.store[this.socket.getId()] = this;
} else {
throw new Error('Websocket instantiation failed! Address might be wrong.');
}
};
出错的地方:
var webSocketFactory = new WebSocketFactory(); //--这步就出错了
出错的日志:
NativeObject.execMethod toString method ; params=[]java.lang.NullPointerException: expected receiver of type java.lang.Object, but got null

2016-02-25 16:40 1 条评论 负责人:无 分享
已邀请:
stevewuxl

stevewuxl (作者)

java代码在调试阶段,先上传

stevewuxl

stevewuxl (作者)

请指导下,要按什么规则来写呀

DCloud_UNI_FXY

DCloud_UNI_FXY

@DCloud_Android_磊子

  • stevewuxl (作者)

    请详细点子,谢谢

    2016-02-25 16:50

maq

maq

plus.android.newObject('com.yusys.socket.WebSocketFactory');

  • stevewuxl (作者)

    您好!,实例化也报错,我先把类的代码弄简单点,再调试下看

    2016-02-25 17:09

  • maq

    这个是系统自带的 package 吗?如果是第三方的,要自己离线打包才可以。

    2016-02-25 17:14

  • stevewuxl (作者)

    需要打包后才能看效果么?

    2016-02-25 17:20

  • stevewuxl (作者)

    直接离线在真机上运行不行哇

    2016-02-25 17:21

  • stevewuxl (作者)

    自己写的类的构造函数:

    public WebSocketFactory() {

    System.out.println("进来了!");

    }

    调用改为了你说的这样:

    var webSocketFactory = plus.android.newObject("com.yusys.socket.WebSocketFactory");

    还是报这个错:

    NativeObject.execMethod toString method ; params=[]java.lang.NullPointerException: expected receiver of type java.lang.Object, but got null

    2016-02-25 17:22

  • maq

    离线打包需要自建原生项目,原生项目不打包的时候在 IDE 里也可以联机调试。

    2016-02-25 17:23

  • stevewuxl (作者)

    我直接用的平台的HBuilder-Hello,这个应该是可以连真机调试吧

    2016-02-25 17:25

  • stevewuxl (作者)

    我的类里面都只剩下一个构造方法了,还是不行呀,一直报:

    NativeObject.execMethod toString method ; params=[]java.lang.NullPointerException: expected receiver of type java.lang.Object, but got null

    难得真的只能打包后才可以?

    2016-02-25 17:30

  • maq

    HBuilder-Hello 是原生项目,可以在 Android Studio 里打开并连真机调试,问题是,你的第三方程序包在里面吗?

    2016-02-25 17:33

  • stevewuxl (作者)

    我自己写的类,放在src下面的

    2016-02-25 17:34

  • maq

    先试试 plus.android.newObject('java.util.ArrayList'),再看问题出在哪个环节。

    2016-02-25 17:42

  • stevewuxl (作者)

    调ArrayList是成功的。

    但是这句代码是正确的:WebSocketFactory = plus.android.importClass("com.yusys.socket.WebSocketFactory");

    打印WebSocketFactory是有值

    在这个方法里面调用:

    var WebSocketObj = function(url) {

    alert("必须要到这里来呀!");


        var webSocketFactory =  plus.android.newObject("com.yusys.socket.WebSocketFactory");  
    alert(webSocketFactory);
    /*
    this.socket = webSocketFactory.getInstance(url);
    alert("22222222222");
    alert(this.socket);
    // store in registry
    if(this.socket) {
    WebSocketObj.store[this.socket.getId()] = this;
    } else {
    throw new Error('Websocket instantiation failed! Address might be wrong.');
    }
    */
    };

    不管是 var webSocketFactory = new WebSocketFactory();

    还是 var webSocketFactory = plus.android.newObject("com.yusys.socket.WebSocketFactory"); 这样 都报错。


    这有点不好理解,因为我的com.yusys.socket.WebSocketFactory这个类只剩下构造方法,放在工程的src目录下,

    document.addEventListener( "plusready", function()

    {

    alert("Hello");

    WebSocketFactory = plus.android.importClass("com.yusys.socket.WebSocketFactory");

    alert(WebSocketFactory);

    WebSocketObj = plus.android.importClass("com.yusys.socket.WebSocket");

    }, true);

    在这里的时候,都能加载到这个类,那么路径是对的。


    在var WebSocketObj这个方法里面都可以实例化ArrayList,那么plus对象是可以用的。

    2016-02-25 17:57

  • maq

    WebSocketFactory 的构造方法是 public 吗?抱歉我只能想到这里了,实在想不出别的可能性了。

    2016-02-25 18:03

  • stevewuxl (作者)

    麻烦你

    能不能,给个具体的实例。

    插件调用我会了。

    问题是webview对象怎么传,跟io.dcloud.common.DHInterface.IWebview 的 evalJS()这个的写法。

    给个例子吧,拜谢!

    2016-02-25 18:05

  • stevewuxl (作者)

    插件方法 性能应该还好些

    2016-02-25 18:05

  • maq

    刚留意到你提供的报错信息里有 toString 的字样,高度怀疑实际程序并不是在你指出的地方出错,而是 js 里有别的代码在干扰。

    2016-02-25 21:14

stevewuxl

stevewuxl (作者)

各位,来帮个忙呀,我搞定后,开源出来。

stevewuxl

stevewuxl (作者)

用插件方式,又不清楚调用到java后,怎么到界面里面去回调js方法。
用上面方式,现在一创建对象就报这个错:
NativeObject.execMethod toString method ; params=[]java.lang.NullPointerException: expected receiver of type java.lang.Object, but got null

头痛,头痛!

  • maq

    把 webview 对象传给 java,在 java 里面调用 io.dcloud.common.DHInterface.IWebview 的 evalJS()。

    2016-02-25 17:48

  • stevewuxl (作者)

    能不能,给个具体的实例。

    插件调用我会了。

    问题是webview对象怎么传,跟io.dcloud.common.DHInterface.IWebview 的 evalJS()这个的写法。

    给个例子吧,拜谢!

    2016-02-25 17:59

  • maq

    java:

    IWebview _webview

    void setWebview(IWebview v) {

    this._webview = v;

    }

    void foo() {

    this._webview.executeScript("javascript:...");

    }


    javascript:

    var bar = plus.android.newObject('...');

    bar.setWebview(plus.webview.currentWebview());


    大概如此吧,我不是很确定。仅供参考。

    2016-02-25 18:12

  • stevewuxl (作者)

    非常感谢

    2016-02-25 20:47

  • moliu

    我也遇到和你一样的报错,请问你是怎么解决的

    2016-02-27 09:12

  • stevewuxl (作者)

    请看maq实测通过的代码

    2016-02-28 10:58

maq

maq

实测通过的代码。

java:

package com.example;  

import android.webkit.WebView;  

public class MyClass {  
    public MyClass() {  
    }  

    WebView _webview;  
    public void setWebView(WebView webview) {  
        this._webview = webview;  
    }  

    public String foo() {  
        this._webview.loadUrl("javascript:alert('from java')");  
        return "OK";  
    }  
}

javascript:

var myObj = plus.android.newObject('com.example.MyClass');  
var webview = plus.webview.currentWebview().nativeInstanceObject();  
plus.android.invoke(myObj, 'setWebView', webview);  
alert(plus.android.invoke(myObj, 'foo'));
  • stevewuxl (作者)

    感谢啊

    感谢

    辛苦了

    2016-02-25 21:53

  • maq

    不客气,呵呵。等你的问题解决了,也给我们说一下到底是卡在哪里,免得再踩坑。

    2016-02-25 22:02

maq

maq

突然想到一个问题,既然上面的代码用这么简单的方式就可以实现 java 与 js 程序的互操作,那么像《第三方插件开发》如此复杂的一套机制的意义又在哪里呢?

  • Kevinshire

    我也想问这个问题

    2016-03-15 22:14

云海帆

云海帆 - 咨询问题请+Q1395641578

nativeJS 记得无法引入第三方库吧? 必须离线打包才行

stevewuxl

stevewuxl (作者)

如果想在APP端解决与WebSocket协议,太复杂;
我后面改用socket方式来处理;
ios还得原生改。

  • Rudy

    搞定了没有?

    2016-03-22 15:43

该问题目前已经被锁定, 无法添加新回复