65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 CLE 和 SL4A 从 Java Android 调用 Python

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年2月28日

CPOL

1分钟阅读

viewsIcon

35139

使用 CLE 和 SL4A 从 Java Android 调用 Python

Java 是开发 Android 平台应用程序的主要语言。但是,在某些情况下,程序员希望从 Java 调用 Python 代码来执行某些功能。

目前,还没有直接的方法可以使用 Python 编写程序。

SL4A 是一个开源项目,支持包括 Python、Lua 等脚本语言。但是,直接从 Java 调用 Python 尚未得到支持。程序员必须使用 JNI 方法和本机代码来编写 Python 的接口。这更加困难,您需要管理 Java 对象和 Python 对象之间的关系、各种引用、接口参数转换以及从 Python 到 Java 的回调函数。

CLE(通用语言扩展)是一种中间件,它提供函数来帮助脚本之间的多语言调用,包括 Java 和 Python。使用 CLE,可以轻松解决上述问题。CLE 的架构如下

Java 调用 Python 函数

Python 函数

Obj=Service._New("TestClass");
def Obj_PythonAdd(self,x,y) :
    return x+y;
Obj.PythonAdd = Obj_PythonAdd;

Java 代码

StarObjectClass a = Service._GetObject("TestClass")._New();
a._Call("PythonAdd",12,34));
Callback of python to java:

Java 回调函数

StarObjectClass a = Service._GetObject("TestClass")._New()._Assign(new StarObjectClass(){
   public int JavaAdd(StarObjectClass self,int x,int y){
       return x+y;
   }
});

Python 代码

Obj.JavaAdd(x,y)

Java 获取在 Python 中定义的对象的属性。

Python: Obj.PythonValue = 200;

Java: a._Get("PythonValue")
Python 获取在 Java 中定义的对象的属性。

Java: a._Set("JavaValue",100);
Python: self.JavaValue

方法 1 源代码(将 CLE 集成到您的项目中)

  1. http://code.google.com/p/android-scripting/downloads/list 安装 SL4A
  2. http://code.google.com/p/cle-for-android 下载 devfiles,然后打开 Eclipse
  3. 创建一个 Android 项目。
  4. 将 CLE 库添加到项目中,如下所示

  5. Python 代码
    SrvGroup = libstarpy._GetSrvGroup()
    
    Service = SrvGroup._GetService("","")
    
    #Create objects
    Obj=Service._New("TestClass");
    
    #Define functions
    def Obj_PythonAdd(self,x,y) :
        print("Call python function...");
        return x+y;
    Obj.PythonAdd = Obj_PythonAdd;
    
    #Call java functions
    def Obj_PythonPrint(self,x,y) :
        print( "Value defined in java is ",self.JavaValue );
        print( "Function result from java ",self.JavaAdd(x,y) );
    Obj.PythonPrint = Obj_PythonPrint;
    
    #define Attributes
    Obj.PythonValue = 200;
  6. Java 代码
    package com.cle.pythonfromjava;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.content.res.AssetManager;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import com.srplab.www.starcore.*;
    
    public class PytonfromjavaActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            //--init CLE
            StarCoreFactoryPath.InitDefault(Runtime.getRuntime(),
    			"/data/data/com.cle.pythonfromjava");
            
    StarCoreFactory starcore= StarCoreFactory.GetFactory();
    StarServiceClass Service=starcore._InitSimple("test","123",0,0);
    Service._CheckPassword(false);
    
    AssetManager assetManager = getAssets();     
    
            try{
                String pythonbuf;
                
                   InputStream dataSource = assetManager.open("code.py");
                   int size=dataSource.available();
                   byte[] buffer=new byte[size]; 
                   dataSource.read(buffer); 
                   dataSource.close();        
                   pythonbuf=new String(buffer);
                   
                Service._RunScript("python",pythonbuf,"cmd","");
            }
            catch(IOException e ){
            }   
            
    StarObjectClass a = Service._GetObject("TestClass")._New()._Assign(new StarObjectClass(){
       public int JavaAdd(StarObjectClass self,int x,int y){
           System.out.println("Call java function...");
           return x+y;
       }
    });
            a._Set("JavaValue",100);
            System.out.println(a._Get("PythonValue")); 
            System.out.println(a._Call("PythonAdd",12,34));           
            a._Call("PythonPrint",56,78);
        }
    
    }

方法 2 源代码(从 http://code.google.com/p/cle-for-android 独立安装 cle)

  1. http://code.google.com/p/android-scripting/downloads/list 安装 SL4A
  2. http://code.google.com/p/cle-for-android/downloads/list 安装 CLE
  3. http://code.google.com/p/cle-for-android 下载 devfiles,然后打开 Eclipse
  4. 创建 Android 项目
  5. Python 代码
    与方法 1 相同
  6. Java 代码
    删除以下代码行。其他与 method1 相同。
    StarCoreFactoryPath.InitDefault(Runtime.getRuntime(),
    			"/data/data/com.cle.pythonfromjava");

可以从 http://www.srplab.com/android/calling_python_from_java.rar 下载示例。

© . All rights reserved.