前言:最近比较忙,天天加班到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>