cocos2d-x mruby mruby-java单向桥

前言:最近比较忙,天天加班到9点。今天才有一点点时间。

如果要做android应用,前面我们知道了怎么调用c/c++方法。那么另一个不可少的选项是调用java方法,这儿我们需要一个mruby-java的单向桥。如果有兴趣,可以在github上找找jamruby项目。但我的办法是简单一点点。不过扩展代码还是挺多的,简单帖一点点吧

void register_mruby_jre_module(mrb_state* mrb){
   init_mrb_jre_converters();
   struct RClass* jre_module = mrb_define_module(mrb, JRE_MODULE_NAME);
   mrb_define_class_method(mrb, jre_module, "get_class", mrb_jre_get_class_static, MRB_ARGS_REQ(1));

   struct RClass *jobj_class = mrb_define_class_under(mrb, jre_module, JOBJECT_CLASS_NAME, mrb->object_class);
   MRB_SET_INSTANCE_TT(jobj_class, MRB_TT_DATA);
   mrb_define_method(mrb, jobj_class, "class", mrb_jre_object_get_class_static, ARGS_NONE());
   mrb_define_method(mrb,jobj_class,"call",mrb_jre_object_call,ARGS_REQ(1));
   mrb_define_method(mrb,jobj_class,"to_s",mrb_jre_object_to_string,ARGS_NONE());
   mrb_define_method(mrb,jobj_class,"get_method",mrb_jre_object_get_method,ARGS_REQ(2));

   struct RClass *jcls_class= mrb_define_class_under(mrb,jre_module,JCLASS_CLASS_NAME,mrb->object_class);
   MRB_SET_INSTANCE_TT(jcls_class, MRB_TT_DATA);
   mrb_define_method(mrb,jcls_class,"new_instance",mrb_jre_class_new_instance,ARGS_REQ(1));
   mrb_define_method(mrb, jcls_class, "call", mrb_jre_class_call_static, ARGS_REQ(1));
   mrb_define_method(mrb,jcls_class,"get_method",mrb_jre_class_get_method,ARGS_REQ(2));

   struct RClass *jmethod_class= mrb_define_class_under(mrb,jre_module,JMETHOD_CLASS_NAME,mrb->object_class);
   MRB_SET_INSTANCE_TT(jmethod_class, MRB_TT_DATA);

}

现在我们能找到java类和方法了,并且能简单的调用它们,开始试试?

begin
         str_class=JRE.get_class('java/lang/String')
          
         str_object=str_class.new_instance("(Ljava/lang/String;)V","0123456789")
         #实例方法
         getBytes=str_object.get_method("getBytes","()[B")
         substring=str_object.get_method("substring","(II)Ljava/lang/String;")
         p "=======%s %s "%[ str_object.call(getBytes).to_s,str_object.call(substring,3,6).to_s]
         #类方法
         valueOf=str_class.get_method("valueOf","(I)Ljava/lang/String;")
         value=12345
         str_obj=str_class.call(valueOf,value)
         p "=====String.valueOf(%d) =%s"%[value,str_obj]
         #现在我们施
         act_class=JRE.get_class("org/cocos2dx/ruby/AppActivity")
         get_current=act_class.get_method("get_current","()Lorg/cocos2dx/lib/Cocos2dxActivity;")
         act_current=act_class.call(get_current)
         p act_current

rescue RuntimeError=>exp
  p "RuntimeError:"%[exp]
rescue StandardError=>exp
  p "StandardError:"%[exp]
end

最后是我们的输出。。。

D/cocos2d-x debug info(17059): [RUBY] "=======[B@42de36a8 345 "
D/cocos2d-x debug info(17059): [RUBY] "=====String.valueOf(12345) =12345"
D/cocos2d-x debug info(17059): [RUBY] #<JRE::JObject:0x7a9f4920>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值