小白 安卓接入微信登录

Android Studio的logcat注意观察看下什么原因导致的闪退,一般都能看到信息,常见的比如Android权限有没有配置。

我截个图给你看下

我现在模拟器打开是没有应用图标的,不懂安卓呀,所以出的啥问题也不清楚…

红色的日志翻到最上面,第一个错误。

2022-09-17 11:34:50.285 1221-7055/com.google.android.gms E/GCM: Missing checkin config file
2022-09-17 11:34:50.287 1221-7055/com.google.android.gms E/GCM: Missing checkin config file
2022-09-17 11:34:50.292 1221-7055/com.google.android.gms E/WakeLock: GCM_HB_ALARM release without a matched acquire!
2022-09-17 11:34:50.703 1221-7062/com.google.android.gms E/GCM: Missing checkin config file
2022-09-17 11:34:50.705 1221-7062/com.google.android.gms E/GCM: Missing checkin config file
2022-09-17 11:34:50.711 1221-7062/com.google.android.gms E/WakeLock: GCM_HB_ALARM release without a matched acquire!
2022-09-17 11:35:52.627 418-418/? E/android.hardware.power.stats@1.0-service-mock: Failed to getEnergyData
2022-09-18 09:53:30.282 575-689/system_process E/LazyAlarmStore: Removed TIME_TICK alarm
2022-09-18 09:53:32.175 7126-7158/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 572)
2022-09-18 09:53:32.424 373-395/? E/android.hardware.audio@7.0-impl.ranchu: device/generic/goldfish/audio/stream_out.cpp:updateSourceMetadata:377 failure: Result::NOT_SUPPORTED
2022-09-18 09:53:32.604 373-395/? E/android.hardware.audio@7.0-impl.ranchu: device/generic/goldfish/audio/stream_out.cpp:updateSourceMetadata:377 failure: Result::NOT_SUPPORTED
2022-09-18 09:53:33.348 7270-7347/? E/GEL_DELAYED_EVENT_DEBUG: Failed delayed event dispatch, no dispatchers.
2022-09-18 09:53:33.378 7270-7328/? E/AwarenessClientProvider: Account associated with identity was null
2022-09-18 09:53:33.407 7270-7319/? E/AwarenessRouterSyncMgr: Exception while syncing fences
java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Account associated with identity was null
at acyh.s(PG:6)
at acyh.get(PG:4)
at adbz.a(PG:1)
at adaq.p(PG:2)
at gzf.run(PG:1)
at nwe.run(PG:1)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at nvp.run(PG:2)
at nvf.run(PG:2)
at java.lang.Thread.run(Thread.java:920)
Caused by: java.lang.IllegalStateException: Account associated with identity was null
at gyl.a(PG:3)
at acyj.f(PG:2)
at acyl.run(PG:9)
at nwe.run(PG:1)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at nvp.run(PG:2)
at nvf.run(PG:2)
at java.lang.Thread.run(Thread.java:920)

是这个么?

你调用奔溃的时候,把error的信息全部贴上来。

我比较建议你接SDK的时候用usb线连接真机调试,模拟器不可靠。

好,我先研究接真机调试

通过usb链接,提示签名不对,但是通过Androidstudio生成的安装到手机上没有这个提示,这个是怎么回事?
:rofl::rofl::rofl::rofl:

你的debug签名文件也要设置成release的才行。

3q,我去修改哈

现在还是授权后退出
Run中的报错信息A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xa4b8 in tid 20496
Logcat的错误信息
2022-09-18 11:03:34.041 418-418/? E/android.hardware.power.stats@1.0-service-mock: Failed to getEnergyData
2022-09-18 11:03:54.208 1297-5870/com.google.android.gms E/WakeLock: DG:service ** IS FORCE-RELEASED ON TIMEOUT **

错误信息就这些?

找到问题了,我把所有的CocosJavascriptJavaBridge注释了,就没有问题,在onResp正确的返回了code值,然后我把这个code值传入ts的时候出错
CocosJavascriptJavaBridge.evalString(String.format(“cc.find(‘Canvas/GameApp’).getComponent(‘GameLauncher’).wechatRespCode(’%s’, ‘%s’);”, result, code));
我这么去处理的,主要不会java相关的,所以我都把值发在ts里面处理,现在是这里出问题,应该怎么去处理java调用ts的问题,这种调用方法我感觉很傻的样子

这里拉起授权,等到授权返回结果,把你的授权数据返回给ts层(你不用看我的具体实现,有个思路就可以)



图片

js_native_cb 放在哪? cocos组件中的onload里面?

js_native_cb 你可以封装成一个类,这个类专门管理你的sdk调用的逻辑,在合适的逻辑初始化对象就可以了。

,这个我也是参考前辈写的修改的。

好的,谢谢了,我去这么处理看看,有不懂的再问你,3q3q

没事,反正趁机划划水。 :smirk:
Native文件提供给你,这个本来也是论坛的前辈写的。
import { log, sys } from “cc”;

/*

Native Caller

bool/string/number/string/function

调用

andrid -> org.cocos2dx.javascript.Native.SayHello(String helloString, String cbName);

ios    -> Native.SayHello : (NSString*) helloString

                     arg1 : (NSString*) cbName;

写法

native.call(“SayHello”, “hello world”, (ok) => { })

native.callClz(“Native”, “SayHello”, “hello world”, (ok) => { })

参考:

https://github.com/qcdong2016/creator-native-bridge

*/

export class Native {

cbs: Object;

constructor() {

    this.cbs = {};

    let self = this;

    //android或者iOS的回调

    (<any>window).js_native_cb = function (cbID) {

        let func = self.cbs[cbID];

        if (func) {

            let args = Array.prototype.slice.call(arguments);

            args.splice(0, 1);

            func.apply(null, args);

        } else {

            log("no func ", cbID);

        }

    }

}

_newCB(key, f) {

    let cbID = "" + key;

    if (this.cbs[cbID] != null) {

        delete this.cbs[cbID];

    }

    this.cbs[cbID] = f;

    return cbID;

}

/**

 * 这个是你调用的方法

 * @param {*} clz 类名, 需在 'org/cocos2dx/javascript/' 路径下

 * @param {*} funcName 方法名

 * @param {*} retType 返回值类型

 */

callClz(clz, funcName, retType?: any, ...args) {

    let real_args = [clz, funcName]

    let funKey = funcName;

    if (sys.os == sys.OS.ANDROID) {

        real_args[0] = "com/cocos/game/" + clz

        real_args[2] = "()"

        // 填充参数

        if (args.length > 0) {

            let sig = ""

            args.forEach((v) => {

                switch (typeof v) {

                    case 'boolean': sig += "Z"; real_args.push(v); break;

                    case 'string': sig += "Ljava/lang/String;"; real_args.push(v); break;

                    case 'number': sig += "I"; real_args.push(v); break;

                    case 'function':

                        sig += "Ljava/lang/String;";

                        real_args.push(this._newCB(funKey, v));

                        break;

                }

            })

            real_args[2] = "(" + sig + ")"

        }

        // 填充返回值

        if (retType) {

            switch (retType) {

                case 'boolean':

                    real_args[2] += 'Z';

                    break;

                case 'string':

                    real_args[2] += 'Ljava/lang/String;';

                    break;

                case 'number':

                    real_args[2] += 'I';

                    break;

            }

        } else {

            real_args[2] += 'V';

        }

    } else if (sys.os == sys.OS.IOS) {

        if (args.length > 0) {

            for (let i = 0; i < args.length; i++) {

                let v = args[i]

                if (typeof v == "function") {

                    real_args.push(this._newCB(funKey, v))

                } else {

                    real_args.push(v)

                }

                if (i == 0) {

                    funcName += ":"

                } else {

                    funcName += "arg" + i + ":"

                }

            }

            real_args[1] = funcName

        }

    } else {

        return

    }

    return jsb.reflection.callStaticMethod.apply(jsb.reflection, real_args);

}

}

(window as any).Native = Native
调用的时候: