Cocos Creator 3.x interacción TS nativa

Prólogo: Cocos Creator3.x ha cambiado mucho y muchas API también. Rellene un hueco aquí para usted;

Estoy usando la versión 3.5.2 aquí

Androide:

TS llama a java: 

Documento oficial: Cómo usar JavaScript para llamar directamente a métodos Java en la plataforma Android Cocos Creator

Guión TS en el creador:


if (sys.os == sys.OS.ANDROID) {
    let className = "com/cocos/game/AppActivity";
    let methodName = "showAd_unified";
    let methodSignature = "()V";
    jsb.reflection.callStaticMethod(className, methodName, methodSignature);
} else if (sys.os == sys.OS.IOS) {

}
  • className: la ruta del nombre del archivo de clase en el proyecto nativo , correspondiente al nombre del script
  •  methodName: el nombre del método estático
    private static void showAd_unified(){
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showInsertAd();
            }
        });
    }
  •  methodSignature: tipo de parámetro de método estático, también llamado firma de método

La firma del método es un poco más complicada, la firma del método más simple es ()Vque representa un método sin parámetros y sin valor de retorno. Algunos otros ejemplos:

  • (I)VUn método que indica que el parámetro es un int y no tiene valor de retorno
  • (I)IIndica que el parámetro es un int y el valor de retorno es un método int
  • (IF)ZIndica que el parámetro es un int y un float, y el valor de retorno es un método booleano

El símbolo dentro de los paréntesis indica el tipo de parámetro y el símbolo después de los paréntesis indica el tipo de valor de retorno. Debido a que Java permite la sobrecarga de funciones, puede haber varios métodos con el mismo nombre de método pero diferentes valores de retorno de parámetros, y la firma del método se usa para ayudar a distinguir estos métodos con el mismo nombre.

Actualmente, hay cuatro tipos de firmas de tipo Java compatibles con Cocos Creator:

tipo Java señal
En t yo
flotar F
booleano DE
Cuerda Ljava/idioma/Cadena;

 Los parámetros pueden ser cero o cualquier número, solo use number, bool y string en JavaScript directamente.

Ejemplo de uso:

// 调用 hello 方法
jsb.reflection.callStaticMethod("com/cocos/game/Test", "hello", "(Ljava/lang/String;)V", "this is a message from JavaScript");

// 调用第一个 sum 方法
var result = jsb.reflection.callStaticMethod("com/cocos/game/Test", "sum", "(II)I", 3, 7);
log(result); // 10

// 调用第二个 sum 方法
var result = jsb.reflection.callStaticMethod("com/cocos/game/Test", "sum", "(I)I", 3);
log(result); // 5

Resumen: Hay dos puntos a tener en cuenta :

  1. TS solo puede llamar a métodos estáticos de Java :
  2. Debería ser que Cocos Creator está en el subproceso GL, así que cambie al subproceso de la interfaz de usuario cuando ejecute métodos Java.
    
    private static void showAd_unified(){
        // activity = this;
        // activity 是当前的 activtiy
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                /// TODO
            }
        });
    }

Java llama a TS: 

Hay mucho cambio aquí

El método anterior fue este: ( más tarde descubrí que  runOnGLThread no hizo clic en él )

activty.runOnGLThread(new Runnable() {
	@Override
	public void run() {
        //相当于直接在项目运行后的console里执行代码 eval() 字符串形式
		Cocos2dxJavascriptJavaBridge.evalString("cc.log(\"Javascript Java bridge!\")");
	}
});

3.X ya se ve así:

 

CocosHelper.runOnGameThread(new Runnable() {
    @Override
    public void run() {
        CocosJavascriptJavaBridge.evalString(String.format("cc.find('Canvas/Layout').getComponent('NativeMannager').showAnimation(%s);", value));
    }
});

Los siguientes parámetros están escritos de manera muy similar a la unidad. Primero busque el nodo Node correspondiente y tome el script anterior antes de llamar al método.

 

 Al pasar parámetros, cuando el parámetro es muy largo o la cadena json o en el parámetro, debe activar Base64

 

static void callJSFunction(final  String value){
    String strBase64 = Base64.encodeToString(value.getBytes(), Base64.DEFAULT);
    final  String jsCall = String.format("cc.find('Canvas/Layout').getComponent('NativeMannager').showAnimation('%s');", strBase64);
    Log.d("AdvertisingManager",jsCall);
    CocosHelper.runOnGameThread(new Runnable() {
        @Override
        public void run() {
            CocosJavascriptJavaBridge.evalString(jsCall);
            //JsbBridge.sendToScript();
        }
    });
}

Íos:

(No tengo mac para agregarlo luego)

Supongo que te gusta

Origin blog.csdn.net/nicepainkiller/article/details/126378580
Recomendado
Clasificación