CLE官网http://www.srplab.com/cn/index.html
下载CLE for Android,解压文件,拷贝 starcore_android_rX.X.jar到工程的libs目录,拷贝 libstar_java.so、libstarcore.so、libpython3.6m.so和libstar_python36.so到libs/x86目录,拷贝编写的Python源码和python需要的环境及标准库到src/main/assets目录.需要的python的.so文件可下载
android.python.x.x.x,解压获得。在build.gradle中android {}中添加
sourceSets.main.jniLibs.srcDirs = ['libs']
使用JAVA初始化CLE http://www.srplab.com/cn/files/cle_initialization.html
import com.srplab.www.starcore.*;
public class test_server{ StarCoreFactoryPath.StarCoreCoreLibraryPath = this.getApplicationInfo().nativeLibraryDir;
StarCoreFactoryPath.StarCoreShareLibraryPath = this.getApplicationInfo().nativeLibraryDir;
StarCoreFactoryPath.StarCoreOperationPath = "/data/data/"+getPackageName()+"/files";
public static void main(String[] args){
StarCoreFactory starcore=StarCoreFactory.GetFactory();
StarServiceClass Service=starcore._InitSimple("test","123",0,0);
StarSrvGroupClass SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup"); ......
SrvGroup._ClearService();
starcore._ModuleExit();
}
}
java调用 python http://www.srplab.com/cn/files/cle_javacallothers.html
- 调用函数"_InitRaw"初始化python接口
- 调用函数"_LoadRawModule"加载python脚本文件
- 使用函数"_ImportRawContext("python","",false,nil);"获取python全局原生对象,python类
- 使用函数"XX._Call("_StarCall",Args...)"或者"XX._New("","",Args,..)"创建python类的实例
- 使用函数"XX._Call("funcname",...)"或者"XX._Get/_Set("Variable")"调用python函数,设置/获取python变量数值
python调用java http://www.srplab.com/cn/files/cle_pythoncallothers.html
- 调用函数 "_InitRaw" 初始化java接口
- 调用函数 "_LoadRawModule" 加载java脚本文件
- 使用函数 "_ImportRawContext("java","",False,"");" 获取java类
- 使用函数 "XX(Args...)" 创建java类的实例
- 使用函数 "XX.func(...)"或者"XX.Variable"调用java函数,获取/设置java变量数值
/*----run python code----*/
SrvGroup._InitRaw("python36", Service); //调用函数_InitRaw初始化python接口
StarObjectClass python = Service._ImportRawContext("python", "", false, "");
// 设置Python模块加载路径
python._Call("import", "sys");
StarObjectClass pythonSys = python._GetObject("sys");
StarObjectClass pythonPath = (StarObjectClass) pythonSys._Get("path");
pythonPath._Call("insert", 0, appFile.getPath() + File.separator + "python3.6.zip");
pythonPath._Call("insert", 0, appLib);
pythonPath._Call("insert", 0, appFile.getPath()); //调用Python代码
Service._DoFile("python", appFile.getPath() + "/py_code.py", "");
long time = python._Calllong("get_time");
Log.d("", "form python time=" + time);
tv1.setText("time:"+String.valueOf(time) + "");
//调用Python代码
Service._DoFile("python", appFile.getPath() + "/test.py", "");
int result = python._Callint("add", 5, 2);
Log.d("", "result=" + result);
tv2.setText("add:"+result + "");
//将一个java类设置给Python,变成Python类
python._Set("JavaClass", Log.class);
Service._DoFile("python", appFile.getPath() + "/calljava.py", "");
出现问题:ModuleNotFoundError("No module named 'encodings'",)Py_Initialize: unable to load the file system codec
A/libc: Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 4184
解决方法:似乎是python版本的问题。
可以查看File appFile = new File("/data/data/"+getPackageName()+"/files");中appFile的值,是否包含多个版本的.so文件