cocos creator js、ts如何调用java中的方法

本文介绍在CocosCreator的JS或TS环境中通过反射调用Android Java方法的详细步骤与实例,包括方法签名的解析及参数传递。

cocos creator js、ts如何调用java中的方法


如果想要在js或ts中调用andorid方法,可以使用反射,看下面的方法:

jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)

然后我举个栗子:

public doVibrate(isShort: boolean = true) {
    jsb.reflection.callStaticMethod("com/xxxx/Admopub/AdmopubHelper", "doVibrate", "(Z)V", isShort)
}

下面结合说明一下:

  • className,是java中的类名,要带上路径,是相对路径,栗子中的是"com/xxxx/Admopub/AdmopubHelper"
  • methodName,是java类中的静态方法"doVibrate"
  • methodSignature,是方法签名,看下面的表,栗子中是"(Z)V"
  • parameters,是你需要传入的参数,需要和前面的methodSignature配合使用,栗子中传入的是isShort

说完了使用,再说下签名的使用:

  • 我在java里面写的public static void doShake(boolean isShort),是一个类型boolean的参数,返回是void,所以调用就使用(Z)V
  • 如果有一个方法是public static int func(),那调用如下,其他就不用解释了:
     jsb.reflection.callStaticMethod("com/xxxx/Admopub/AdmopubHelper", "func", "()I");
    

类型签名
intI
floatF
booleanZ
StringLjava/lang/String;

维尼聚合工具


Cocos Creator 3.8.6 中使用 TypeScript 调用 Android 平台的原生相机和语音功能,需要通过 JavaScript 与 Java 原生代码的交互机制来实现。Cocos Creator 提供了 `jsb.reflection.callStaticMethod` 接口用于调用 Android 的 Java 方法,从而实现对原生功能的访问[^1]。 ### 调用 Android 原生相机 #### Java 层实现 在 Android 项目中创建一个 Java 类 `NativeCamera.java`,用于启动相机并返回结果: ```java package org.cocos2dx.javascript; import android.content.Intent; import android.provider.MediaStore; import android.app.Activity; public class NativeCamera { private static final int CAMERA_REQUEST_CODE = 100; private static Activity getActivity() { return ((CocosActivity) CocosActivity.getContext()); } public static void openCamera() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) { getActivity().startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE); } } } ``` #### TypeScript 层调用 在 TypeScript 中调用 Java 方法: ```typescript if (cc.sys.os === cc.sys.OS_ANDROID) { jsb.reflection.callStaticMethod("org/cocos2dx/javascript/NativeCamera", "openCamera", "()V"); } ``` 在 `CocosActivity.java` 中重写 `onActivityResult` 方法以接收相机返回的数据,并通过 JavaScript 接口将结果传递回游戏逻辑: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == NativeCamera.CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); CocosHelper.runOnGameThread(() -> { CocosJavascriptJavaBridge.evalString("cc.game.onCameraResult('" + bitmapToBase64(photo) + "')"); }); } } ``` ### 调用 Android 原生语音识别 #### Java 层实现 创建 `NativeSpeechRecognizer.java` 实现语音识别调用: ```java package org.cocos2dx.javascript; import android.content.Intent; import android.speech.RecognizerIntent; import android.app.Activity; public class NativeSpeechRecognizer { private static final int SPEECH_REQUEST_CODE = 200; private static Activity getActivity() { return ((CocosActivity) CocosActivity.getContext()); } public static void startSpeechRecognition() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); if (intent.resolveActivity(getActivity().getPackageManager()) != null) { getActivity().startActivityForResult(intent, SPEECH_REQUEST_CODE); } } } ``` #### TypeScript 层调用 ```typescript if (cc.sys.os === cc.sys.OS_ANDROID) { jsb.reflection.callStaticMethod("org/cocos2dx/javascript/NativeSpeechRecognizer", "startSpeechRecognition", "()V"); } ``` 同样,在 `onActivityResult` 中处理语音识别结果: ```java if (requestCode == NativeSpeechRecognizer.SPEECH_REQUEST_CODE && resultCode == Activity.RESULT_OK) { ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); String spokenText = results.get(0); CocosJavascriptJavaBridge.evalString("cc.game.onSpeechResult('" + spokenText + "')"); } ``` ### 注意事项 - 在 `AndroidManifest.xml` 中添加必要的权限声明: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> ``` - 在 TypeScript 中应确保对 `cc.sys.os` 的判断准确,避免非 Android 平台执行原生调用。 - 原生功能调用应使用条件编译控制代码执行范围,确保仅在 Android 平台运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值