使用NDK编译ruby相对比较容易,编译之后获得的共享库,可以在android中使用,这里是一个androidruby解释器的例子,版本为ruby2.2,也可以是其它版本。这里的例子为了说明如何初始化ruby解释器,运行ruby脚本,例子中的界面比较简单,一个输入栏用于输入ruby脚,一个输出栏用于显示运行的结果。Android代码基于java,需要通过java调用ruby。例子的基本过程与之前的python解释器类似,请参考之前的博文。

1.创建工程

   工程使用eclipse创建,可以导入到android studio中。创建一个android,将starcore_android_r2.51.jar拷贝到libs目录下,将共享库拷贝到libs/armeabi目录下:libruby.solibstar_java.solibstarcore.solibstar_ruby.so;如果需要其它ruby模块,可以拷贝到assets目录,在程序运行之后再拷贝到应用的运行目录中。

   

2.初始化CLEruby  

    例子基于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();   }});

示例下载






更多相关文章

  1. Android之EventBus1.0 和EventBus3.0的使用详解
  2. Google Android如何分析和研究Log文件 ,如何看日志信息
  3. 【Android每日一讲】2012.11.01 程序加载中,请稍后 - ProgressDia
  4. 为包含工作线程Android程序编写稳定的instrumentation测试
  5. android面试(7)-handler机制
  6. 2011android面试题目及其答案大全
  7. Android(安卓)线程模型和 AsyncTask
  8. Android线程间通信-Handler消息机制
  9. Android(安卓)消息机制(Handler Looper Message )理解

随机推荐

  1. Android(安卓)Preference 须知
  2. Android之NDK开发 环境配置
  3. Android接口回调总结,以及运用到弹窗PopWi
  4. Android今日头条UI适配完善版
  5. Android内核开发:系统分区与镜像文件的烧
  6. [Android实例] 基于android的远程视频监
  7. Android之Binder浅析
  8. OpenCV移动端之android JNI
  9. Android(安卓)Studio简记
  10. Android之Layout资源文件