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
()V
que representa un método sin parámetros y sin valor de retorno. Algunos otros ejemplos:
(I)V
Un método que indica que el parámetro es un int y no tiene valor de retorno(I)I
Indica que el parámetro es un int y el valor de retorno es un método int(IF)Z
Indica que el parámetro es un int y un float, y el valor de retorno es un método booleanoEl 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 :
- TS solo puede llamar a métodos estáticos de Java :
- 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)