使用 CLE 和 SL4A 从 Java Android 调用 Python
使用 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 集成到您的项目中)
- 从 http://code.google.com/p/android-scripting/downloads/list 安装 SL4A
- 从 http://code.google.com/p/cle-for-android 下载 devfiles,然后打开 Eclipse
- 创建一个 Android 项目。
- 将 CLE 库添加到项目中,如下所示
- 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;
- 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)
- 从 http://code.google.com/p/android-scripting/downloads/list 安装 SL4A
- 从 http://code.google.com/p/cle-for-android/downloads/list 安装 CLE
- 从 http://code.google.com/p/cle-for-android 下载 devfiles,然后打开 Eclipse
- 创建 Android 项目
- Python 代码
与方法 1 相同 - Java 代码
删除以下代码行。其他与method1
相同。StarCoreFactoryPath.InitDefault(Runtime.getRuntime(), "/data/data/com.cle.pythonfromjava");
可以从 http://www.srplab.com/android/calling_python_from_java.rar 下载示例。