看到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
10 个回复
stevewuxl (作者)
java代码在调试阶段,先上传
stevewuxl (作者)
请指导下,要按什么规则来写呀
DCloud_UNI_FXY
@DCloud_Android_磊子
stevewuxl (作者)
请详细点子,谢谢
2016-02-25 16:50
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 = 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 (作者)
用插件方式,又不清楚调用到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
实测通过的代码。
java:
javascript:
stevewuxl (作者)
感谢啊
感谢
辛苦了
2016-02-25 21:53
maq
不客气,呵呵。等你的问题解决了,也给我们说一下到底是卡在哪里,免得再踩坑。
2016-02-25 22:02
maq
突然想到一个问题,既然上面的代码用这么简单的方式就可以实现 java 与 js 程序的互操作,那么像《第三方插件开发》如此复杂的一套机制的意义又在哪里呢?
Kevinshire
我也想问这个问题
2016-03-15 22:14
云海帆 - 咨询问题请+Q1395641578
nativeJS 记得无法引入第三方库吧? 必须离线打包才行
stevewuxl (作者)
如果想在APP端解决与WebSocket协议,太复杂;
我后面改用socket方式来处理;
ios还得原生改。
Rudy
搞定了没有?
2016-03-22 15:43