真是林子大了什么鸟都有啊,最近发现一个CLE的东东,可以支持各种编程语言之间的相互调用:
http://www.srplab.com/index.html
安卓版本支持Java调用Python代码,也支持Python调用Java代码,地址如下:
http://code.google.com/p/cle-for-android/
安卓下有个例子:
Python accesses android GUI element
This example shows how to access android java class using python directly. The example uses python script to create a button on screen and capture it's onclick event.
The python code is show as follow:
#--prepare python environment
SrvGroup=libstarpy._GetSrvGroup()
Service=SrvGroup._GetService("","")
Toast = Service._ImportRawContext("java","android/widget/Toast",True,"");
def main(activity) :
#--create absolute layout
AbsoluteLayout = Service._ImportRawContext("java","android/widget/AbsoluteLayout",True,"");
abslayout=AbsoluteLayout(activity);
activity.setContentView(abslayout);
#--create button
print(Service)
Button = Service._ImportRawContext("java","android/widget/Button",True,"");
btn1 = Button(activity);
btn1.setText("Hello World");
#--create event proxy
btnevent = Service._New();
def btnevent_onClick(self,view) :
print( view )
Toast.makeText(activity, "Is clicked", Toast.LENGTH_SHORT ).show()
btnevent.onClick = btnevent_onClick
btnevent_proxy = Service._NewRawProxy("java",btnevent,"","android.view.View$OnClickListener",0);
btn1.setOnClickListener( btnevent_proxy );
#--create layout
ViewGroup_LayoutParams = Service._ImportRawContext("java","android/view/ViewGroup$LayoutParams",True,"");
LayoutParams = Service._ImportRawContext("java","android/widget/AbsoluteLayout$LayoutParams",True,"");
#--add button to layout
lp1 = LayoutParams(ViewGroup_LayoutParams.WRAP_CONTENT,ViewGroup_LayoutParams.WRAP_CONTENT,0,100)
abslayout.addView(btn1, lp1 );
Java code:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*----load test.py----*/
String pythonstring = null;
try{
AssetManager assetManager = getAssets();
InputStream dataSource = assetManager.open("test.py");
int size=dataSource.available();
byte[] buffer=new byte[size];
dataSource.read(buffer);
dataSource.close();
pythonstring=new String(buffer);
}
catch(IOException e ){
}
/*----init starcore----*/
StarCoreFactoryPath.StarCoreCoreLibraryPath = "/data/data/"+getPackageName()+"/lib";
StarCoreFactoryPath.StarCoreShareLibraryPath = "/data/data/"+getPackageName()+"/lib";
StarCoreFactory starcore= StarCoreFactory.GetFactory();
StarServiceClass Service=starcore._InitSimple("test","123",0,0);
StarSrvGroupClass SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup");
Service._CheckPassword(false);
/*----run python code----*/
Service._RunScript("python", pythonstring, "", "");
SrvGroup._InitRaw("python",Service);
StarObjectClass python = Service._ImportRawContext("python","",false,"");
/*---wrap activity object for python---*/
StarObjectClass activityobj = Service._New();
activityobj._AttachRawObject(this,false);
/*---call lua python function----*/
python._Call("main", activityobj);
}
我是很好奇Button的OnClickListener是怎么调用Python代码的,
只可惜从2.0版本开始要付费了,真是逆历史潮流而动,不过有空还是可以研究研究,这里作下记录。