CocosCreator 中 JS 与 Java 互相调用

ayfenglp 6年前
   <p>最近项目是使用 CocosCreator 开发的一款小游戏,有些功能需要调用 Android 原生代码,这涉及到 CocosCreator 中 JS 与 Java 的互相调用问题,本文记录互相调用时的方式和注意事项。</p>    <h3>1. JS 调用 Java 方法</h3>    <p>在 CocosCreator 下 JS 调用 Java/Objective-C 的格式都是:</p>    <pre>  <code class="language-javascript">var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)  </code></pre>    <p>JS 只能调用 Java 中的静态方法,需要传入类名、方法名、方法签名、方法参数,并且可以获得返回值。</p>    <p>类名</p>    <p>类名必须是包含 Java 包路径的完整类名,而且用斜线 / 代替点 . ,例如 com.johnny.test.WxApiHelper 应该传入 com/johnny/test/WxApiHelper 。</p>    <p>方法名</p>    <p>方法名很简单,就是方法本来的名字。</p>    <p>方法签名</p>    <p>方法签名有点复杂,最简单的方法签名是 ()V ,它表示一个没有参数也没有返回值的方法。括号里的符号表示参数类型,括号后面的符号表示返回值类型。因为 Java 是允许函数重载的,可以有多个方法名相同但是参数返回值不同的方法,方法签名正是用来帮助区分这些相同名字的方法的。</p>    <p>目前 Cocos Creator 中支持的 Java 类型签名有下面 4 种:</p>    <table>     <thead>      <tr>       <th><strong>Java 类型</strong></th>       <th><strong>签名</strong></th>      </tr>     </thead>     <tbody>      <tr>       <td>int</td>       <td>I</td>      </tr>      <tr>       <td>float</td>       <td>F</td>      </tr>      <tr>       <td>boolean</td>       <td>Z</td>      </tr>      <tr>       <td>String</td>       <td>Ljava/lang/String;</td>      </tr>     </tbody>    </table>    <p>如果是其他类型的话,可以考虑转换为 JSON 字符串。</p>    <p>参数</p>    <p>参数可以是 0 个或任意多个,直接使用 JS 中的 number,bool 和 string 就可以。</p>    <p>注意,如果 JS 调用 Java 过程中,需要更新 UI 元素,更新的部分代码需要运行在 UI 线程中 Activity.runOnUiThread(Runnable) ,因为 JS 调用 Java 的过程不是运行在 UI 线程中的。</p>    <h3>2. Java 调用 JS 函数</h3>    <p>有时候还需要在 Java 中回调 JS 函数,例如微信登录成功后回调给 JS 函数,目前的方式是用 Cocos2dxJavascriptJavaBridge 的静态方法 evalString() 。</p>    <pre>  <code class="language-javascript">// cc.wxcb 是挂在 cc 的一个对象  Cocos2dxJavascriptJavaBridge.evalString("cc.wxcb.onLoginResp('"+ authResp.token +"')");  </code></pre>    <p>所传参数只支持 JS 中的 number,bool 和 string。</p>    <p>但是需要注意的是 Java 回调 JS 时,一定要运行在 GL 线程中:</p>    <pre>  <code class="language-javascript">activity.runOnGLThread(new Runnable() {      @Override      public void run(){          Cocos2dxJavascriptJavaBridge.evalString("cc.wxcb.onLoginResp('"+ authResp.token +"')");      }  });  </code></pre>    <p> </p>    <p>来自:http://johnnyshieh.me/posts/cocoscreator-js-java-call-each-other/</p>    <p> </p>