Android的Ruby解释器
来源:互联网 发布:淘宝店铺商品搜不到 编辑:程序博客网 时间:2024/06/06 21:31
使用NDK编译ruby相对比较容易,编译之后获得的共享库,可以在android中使用,这里是一个android的ruby解释器的例子,版本为ruby2.2,也可以是其它版本。这里的例子为了说明如何初始化ruby解释器,运行ruby脚本,例子中的界面比较简单,一个输入栏用于输入ruby脚,一个输出栏用于显示运行的结果。Android代码基于java,需要通过java调用ruby。例子的基本过程与之前的python解释器类似,请参考之前的博文。
1.创建工程
工程使用eclipse创建,可以导入到android studio中。创建一个android,将starcore_android_r2.51.jar拷贝到libs目录下,将共享库拷贝到libs/armeabi目录下:libruby.so;libstar_java.so;libstarcore.so;libstar_ruby.so;如果需要其它ruby模块,可以拷贝到assets目录,在程序运行之后再拷贝到应用的运行目录中。
2.初始化CLE和ruby
例子基于CLE开发,首先需要初始化CLE,为了不影响界面刷新,使用独立的线程进行初始化,CLE运行于初始化的线程中。但是从界面线程或者其它线程中调用CLE相关的函数,或者执行ruby脚本,需要进行加锁操作,此外该线程需要维护CLE的消息循环。
创建线程,初始化ruby,然后进入CLE的消息循环
final String LibPath = this.getApplicationInfo().nativeLibraryDir; final String PackagePath = "/data/data/"+getPackageName(); new Thread(new Runnable(){ @Override public void run() { starcore= StarCoreFactory.GetFactory(); Service=starcore._InitSimple("test","123",0,0);starcore._RegMsgCallBack_P(new StarMsgCallBackInterface(){public Object Invoke(int ServiceGroupID, int uMes, Object wParam, Object lParam){if (uMes == starcore._Getint("MSG_DISPMSG") || uMes == starcore._Getint("MSG_DISPLUAMSG") ){final String Str = (String)wParam;UIHandler.post(new Runnable() {public void run() {textbox.setText(Str);}});}return null;}}); SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup"); Service._CheckPassword(false); /*----run python code----*/ SrvGroup._InitRaw("ruby",Service); StarObjectClass ruby = Service._ImportRawContext("ruby","",false,""); StarObjectClass LOAD_PATH = (StarObjectClass)ruby._Get("LOAD_PATH");LOAD_PATH._Call("unshift", "/data/data/"+getPackageName()+"/files"); //--enter message loop while (true) { while (starcore._SRPDispatch(false) == true) ; starcore._SRPUnLock(); try{ Thread.sleep(10); } catch(Exception x) { } starcore._SRPLock(); } } }).start();
3.捕获ruby脚本的输出
为了捕获ruby脚本的输出结果,需要注册CLE的回调函数,在回调函数中,将输出结果显示到文本框中,由于回调函数运行在初始化CLE的线程中,因此需要使用Handler。
starcore._RegMsgCallBack_P(new StarMsgCallBackInterface(){ public Object Invoke(int ServiceGroupID, int uMes, Object wParam, Object lParam){ if (uMes == starcore._Getint("MSG_DISPMSG") || uMes == starcore._Getint("MSG_DISPLUAMSG") ) { final String Str = (String)wParam; UIHandler.post(new Runnable() { public void run() { textbox.setText(Str); } }); } return null; }});
4.执行ruby脚本
a.编译不执行
可以只编译脚本,不执行,此时检查脚本中的语法错误。编译脚本需要调用CLE的函数_PreCompile。该函数返回一个object[]数组,如果object[0]是true,则成功编译;如果为false, 并且object[1]的长度为0,表示输入脚本不完整;否则object[1]返回编译错误。
compilebtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { textbox.setText(""); String script = editbox.getText().toString(); if (script.length() == 0) return; starcore._SRPLock(); Object[] result = SrvGroup._PreCompile("ruby", script+"\n"); starcore._SRPUnLock(); if ((Boolean) result[0] == true) textbox.setText("success"); else { if (((String)result[1]).length() == 0 || ((String)result[1]).indexOf("unexpected end") >= 0 ) textbox.setText("More Input"); else textbox.setText((String)result[1]); } }});
b.直接执行脚本
调用CLE的函数_RunScript执行ruby脚本。脚本的输出会被之前设置的回调函数捕获,显示到输出窗口中。
runbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { textbox.setText(""); String script = editbox.getText().toString(); if (script.length() == 0) return; starcore._SRPLock(); Service._RunScript("ruby", script + "\n", "", ""); starcore._SRPUnLock(); }});
示例下载
- Android的Ruby解释器
- 一段Ruby代码的解释
- 对《Ruby入门》元编程的解释
- 对《Ruby入门》元编程的解释
- 如何正确编译ruby解释器
- ruby解释器中的节点分类
- (如何写 (Lisp) 解释器 (用Ruby哦))
- Android的设计模式-解释器模式
- android:descendantFocusability的解释
- Android上的Ruby模拟器:Ruboto
- Android 中Binder的解释
- android的一些路径解释
- android WebViewClient的方法解释
- Android.mk文件的解释
- android WebViewClient的方法解释
- Android的AIDL 解释Demo
- Android 中view的解释
- 可运行于Android的Python解释器
- 433. Minimum Genetic Mutation
- AtCoder
- Missing compiler_cxx fix for MSVCCompiler
- 使用jquery validate和ajax进行表单验证并向后台提交数据
- Maven目录结构
- Android的Ruby解释器
- 并不是从零开始的java web项目创作(一)
- linux学习记录
- react学习笔记(2)
- STL模板总结归纳(set,multiset和map,multimap)
- 检测率,召回率,mAP,ROC
- 错误:java.lang.IllegalArgumentException:No view found for id for fragment 的解决
- LVS源码剖析-init
- 设计模式---组合模式(C++实现)