joshuastray2014-08-04 14:47:01328 次阅读

在Cocos2d-js 3.0beta中加入了一个新特性,在Android平台上我们可以通过反射直接在js中调用java的静态方法。它的使用方法很简单:

1 varo=jsb.reflection.callStaticMethod(className,methodName,methodSignature,parameters...)


在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回值。下面介绍的类名和方法签名可能会有一点奇怪,但是Java的规范就是如此的。


类名

参数中的类名必须是包含Java包路径的完整类名,例如我们在org.cocos2dx.javascript这个包下面写了一个Test类:

1 2 3 4 5 6 7 8 9 10 11 12 packageorg.cocos2dx.javascript; public class Test{ public static void hello(Stringmsg){ System.out.println(msg); } public static int sum( int a, int b){ return a+b; } public static int sum( int a){ return a+2; } }


那么这个Test类的完整类名应该是org/cocos2dx/javascript/Test,注意这里必须是斜线/,而不是在Java代码中我们习惯的点。


方法名

方法名很简单,就是方法本来的名字,例如sum方法的名字就是sum。


方法签名

方法签名稍微有一点复杂,最简单的方法签名是()V,它表示一个没有参数没有返回值的方法。其他一些例子:

(I)V表示参数为一个int,没有返回值的方法;

(I)I表示参数为一个int,返回值为int的方法;

(IF)Z表示参数为一个int和一个float,返回值为boolean的方法;


现在有一些理解了吧,括号内的符号表示参数类型,括号后面的符号表示返回值类型。因为Java是允许函数重载的,可以有多个方法名相同但是参数返回值不同的方法,方法签名正是用来帮助区分这些相同名字的方法的。


目前Cocos2d-js中支持的Java类型签名有下面4种:


参数

参数可以是0个或任意多个,直接使用js中的number,bool和string就可以。


使用示例

我们将会调用上面的Test类中的静态方法:

1 2 3 4 5 6 7 8 9 10 //调用hello方法 jsb.reflection.callStaticMethod( "org/cocos2dx/javascript/Test" , "hello" , "(Ljava/lang/String)V" , "thisisamessagefromjs" ); //调用第一个sum方法 varresult=jsb.reflection.callStaticMethod( "org/cocos2dx/javascript/Test" , "sum" , "(II)I" ,3,7); cc. log (result); //10 //调用第二个sum方法 varresult=jsb.reflection.callStaticMethod( "org/cocos2dx/javascript/Test" , "sum" , "(I)I" ,3); cc. log (result); //5

在你的控制台会有正确的输出的,这很简单吧。


注意

另外有一点需要注意的就是,在android应用中,cocos的渲染和js的逻辑是在gl线程中进行的,而android本身的UI更新是在app的ui线程进行的,所以如果我们在js中调用的Java方法有任何刷新UI的操作,都需要在ui线程进行。


例如,在下面的例子中我们会调用一个Java方法,它弹出一个android的Alert对话框。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 //给我们熟悉的AppActivity类稍微加点东西 public class AppActivityextendsCocos2dxActivity{ private static AppActivityapp=null; @Override public void onCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); app= this ; } public static void showAlertDialog(finalStringtitle,finalStringmessage){ //这里一定要使用runOnUiThread app.runOnUiThread( new Runnable(){ @Override public void run(){ AlertDialogalertDialog= new AlertDialog.Builder(app).create(); alertDialog.setTitle(title); alertDialog.setMessage(message); alertDialog.setIcon(R.drawable.icon); alertDialog.show(); } }); } }


然后我们在js中调用

1 jsb.reflection.callStaticMethod( "org/cocos2dx/javascript/AppActivity" , "showAlertDialog" , "(Ljava/lang/String;Ljava/lang/String;)V" , "title" , "hahahahha" );

这样调用你就可以看到一个android原生的Alert对话框了。


再加点料

现在我们可以从js调用Java了,那么能不能反过来?当然可以! 在你的项目中包含Cocos2dxJavascriptJavaBridge,这个类有一个evalString方法可以执行js代码,它位于frameworks\js-bindings\bindings\manual\platform\android\java\src\org\cocos2dx\lib文件夹下。我们将会给刚才的Alert对话框增加一个按钮,并在它的响应中执行js。和上面的情况相反,这次执行js代码必须在gl线程中进行。

1 2 3 4 5 6 7 8 9 10 11 alertDialog.setButton( "OK" , new DialogInterface.OnClickListener(){ public void onClick(DialogInterfacedialog, int which){ //一定要在GL线程中执行 app.runOnGLThread( new Runnable(){ @Override public void run(){ Cocos2dxJavascriptJavaBridge.evalString( "cc.log(\"JavascriptJavabridge!\")" ); } }); } });


这样在点击OK按钮后,你应该可以在控制台看到正确的输出。evalString可以执行任何js代码,并且它可以访问到你在js代码中的对象。

更多相关文章

  1. android canvas与图层的关系
  2. Android(安卓)RectF转换为Rect的方法
  3. android eclipse中导入framework.jar以及使用其隐藏类的方法
  4. Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上
  5. Android(安卓)SQLite3 数据库操作
  6. Android(安卓)短信发送
  7. android Tabhost中,控制activity的生命周期
  8. Android中文API(133) —— LocationListener
  9. APK安装过程详解

随机推荐

  1. Android(安卓)自定义控件,模仿小米秒表样
  2. android动态生成控件
  3. Android发送dtmf键盘事件(模拟通话界面键
  4. Android 3D 旋转的三角形(三)
  5. Android解压中文乱码
  6. android studio 读取短信
  7. android:软件的安装和卸载源代码
  8. React Native与Android之间的通信
  9. android 6.0权限全面详细分析和解决方案
  10. Android获取SD卡视频音频文件