帮忙看看java 反射调用 js 找不到类

手动接SDK,java调用js代码,报错误 找不到类。
java代码为:
// 登录回调
private static void onLoginCallback(int result, String data)
{
String escapeData = escapeJson(data);
Log.e(“onLoginCallback111”, data);
String jsString = “WSSDK.getInstance().onLoginCallback(” + result + “,’” + escapeData + “’);”;
//String jsString = “cc.log(” + result + “,’” + escapeData + “’);”;
Cocos2dxJavascriptJavaBridge.evalString(jsString);

    //Cocos2dxJavascriptJavaBridge.evalString("cc.log(\"Javascript Java bridge!\")");
}

js代码类为:
var event = require(“Event”);

var WSSDK = cc.Class({

ctor:function() {

},

loginChannel:function() {

    jsb.reflection.callStaticMethod("org/cocos2dx/javascript/OGSDKUtils",
    "loginChannel",
    "()V");
},

onLoginCallback : function(result, data) {
    var data = decodeURI(data);
    cc.log("ogsdk login result : " + data);
    event.getInstance().send("SDK_ONLOGIN", data);
}

});

WSSDK.sharedManager = null;
WSSDK.getInstance = function () {
** WSSDK.sharedManager = new WSSDK();**
** return WSSDK.sharedManager;**
};

module.exports = WSSDK;

错误: **E/jswrapper: ERROR: Uncaught ReferenceError: WSSDK is not defined**文字缩进4格

1赞

是不是Java的符号被优化掉了?你自己试试,添加接口保留代码,确认下。

1赞

在android studio中添加这个,还是不行,运行还是错误,找不到WSSDK “WSSDK is not defined,”

我的js代码我看没有问题。使用的是单例模式。

java代码贴图:


js代码图片如上,下面的注释掉的方法也调用了还是不行。
这个问题折腾我半天了。

不是增加我圈的东西,我这代码原来就有的呢!! 是额外加入你引用的java模块类名额 。。。

从你的JS代码来看,WSSDK根本就不是一个全局变量,从而导致undefine,你可以在游戏启动的瞬间,将WSSDK引用并实例化,然后赋值给cc,例如cc.WSSdk = new WSSDK(); 在java端,调用String jsString = “cc.WSSdk.getInstance().onLoginCallback(” + result + “,’” + escapeData + “’);”;

谢谢,使用了你的建议js端采用:
cc.WSSdk = WSSDK.getInstance();
这样的方法,是WSSDK作为一个全局变量。
在java端调用:String jsString = “cc.WSSdk.onLoginCallback(” + result + “,’” + escapeData + “’);”;
Cocos2dxJavascriptJavaBridge.evalString(jsString);

解决了这个问题,但是我还有一个疑问。
为什么我使用WSSDK.getInstance() 这个单例方法不行呢。
最早在cocos2d-js 版本就是这样使用没有问题。
但是到了creator 这个版本 就不能使用,必须要赋值给cc 使用这样的赋值方法呢。cc.WSSdk = WSSDK.getInstance();这种写法看着很别扭。

window.WSSDK = WSSDK
加上这一句试试

在cocos2d-js写的意思是:window.WSSDK.getInstance(),变成全局了声明的时候在window下。
在creator写模块化了,类似
module = {
WSSDK:WSSDK
}
写的不规范,意思是这个意思。就不能全局调了。

在creator里面 的模块化,和单例全局类我现在有点儿混淆。
以前cocos2dx-js的代码直接挪到 creator里面各种报错。到处找不到。
cocos2dx-js 里面写一个类,在别的地方直接就使用,都不用import,也不用require。

麻烦jonle给个特别简单的例子,在creator里面怎么写一个单例类,不用模块化。

这里有点儿懵。这两天想把2dx-js的代码直接挪到creator_js下各种不好用。各种改。

对于这个模块和单例类(全局类)有点儿乱。麻烦给俩简单的特别简单的例子即可。

你在你的文件下边加上这个
window.WSSDK = WSSDK;
就可以全局访问了。

模块化简单讲是把自己声明的变量放到一个统一变量(非window)下。想访问它就得从那个统一的变量获取

1赞