android开发调用python脚本

android开发调用python脚本

一.环境准备

在官网下载最新的CLE for Android 开发包,其中包含示例工程和API文档。解压开发包,拷贝如下文件

http://www.srplab.com/cn/files/products.html

你可能会遇到的问题

1:注意so版本;版本都要一致,从开发包里复制粘贴;

2:注意so引入路径;as和ec是有区别的;

拷贝 starcore_android_rX.X.jar的arm64-v8a目录内容到工程的libs目录

拷贝starcore_android_rX.X.jar的到starcore_android_r3.7.dex、starcore_android_r3.7.jar到libs目录,

asset中的so在android.python.3.4.5.zip包和android.python.3.7.0.zip包解压出来的,

如下图:

libs的和assets里面的so;

二、编写Python代码

test.py文件内容如下:

def add(x,y) :

return x+y

calljava.py内容如下:

import imp  #test load path

def log(content):

JavaClass.d("formPython",content)

log("Hello Android,form python")

py_code.py内容如下:

import time

def get_time():

return time.time()

将py_code.py压缩为py_code.zip文件。将编写的Python源码放入Android 工程的assets目录,其中还要包含一些Python需要的环境及标准库(android.python.3.7.0里面arm64-v8a\lib-dynload中找到对应的so库),见下图

三、编写Android相关代码,初始化CLE并调用Python

package com.cootf.mytest;

import android.app.Activity;

import android.app.ActivityManager;

import android.content.Context;

import android.content.Intent;

import android.net.ConnectivityManager;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.RemoteException;

import android.telephony.TelephonyManager;

import android.util.Log;

import com.srplab.www.starcore.StarCoreFactory;

import com.srplab.www.starcore.StarCoreFactoryPath;

import com.srplab.www.starcore.StarObjectClass;

import com.srplab.www.starcore.StarServiceClass;

import com.srplab.www.starcore.StarSrvGroupClass;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Iterator;

import java.util.concurrent.TimeUnit;

import rx.Observable;

import rx.Observer;

import rx.Subscription;

import rx.android.schedulers.AndroidSchedulers;

public class MainActivity extends Activity {

private static final String TAG = MainActivity.class.getSimpleName();

private Subscription mSubscription;

ActivityManager mAm;

public StarSrvGroupClass SrvGroup;

private StarServiceClass Service;

private StarCoreFactory starcore;

private StarObjectClass python;

private File appFile ;

private String appLib ;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Log.d(TAG,"onCreate");

setContentView(R.layout.activity_main);

mAm = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

Iterator iter =                mAm.getRunningTasks(100).iterator();

appFile = getApplicationContext().getFilesDir();  /*-- /data/data/packageName/files --*/

appLib = getApplicationInfo().nativeLibraryDir;

Intent intent = new Intent(this,ToolService.class);

startService(intent);

loadPy();

}

void loadPy(){

loadPyEnviroment();

initCle();

runPy();

}

private void loadPyEnviroment() {

//拷贝Python相关环境

File pythonLibFile = new File(appFile, "python3.7.zip");

if (!pythonLibFile.exists()) {

copyFile(this, "python3.7.zip");

copyFile(this, "_struct.cpython-37m.so");

copyFile(this, "binascii.cpython-37m.so");

copyFile(this, "time.cpython-34m.so");

copyFile(this, "zlib.cpython-37m.so");

}

// 拷贝Python 代码

copyFile(this, "calljava.py");

//copyFileFromSdcard(this, "test.py"); //验证读取sdcard里面的文件也可以

copyFile(this, "test.py");

try {

// 加载Python解释器

System.load(appLib + File.separator + "libpython3.7m.so");

// 除了将代码直接拷贝,还支持将代码压缩为zip包,通过Install方法解压到指定路径

InputStream dataSource = getAssets().open("py_code.zip");

StarCoreFactoryPath.Install(dataSource, appFile.getPath(),true );

} catch (Exception e) {

e.printStackTrace();

}

}

private void initCle() {

/*----init starcore----*/

StarCoreFactoryPath.StarCoreCoreLibraryPath = appLib;

StarCoreFactoryPath.StarCoreShareLibraryPath = appLib;

StarCoreFactoryPath.StarCoreOperationPath = appFile.getPath();

starcore = StarCoreFactory.GetFactory();

starcore._SRPLock();

Log.d(TAG,"zjy startcore:"+starcore);

SrvGroup = starcore._GetSrvGroup(0);

Log.d(TAG,"zjy SrvGroup:"+SrvGroup);

Service = SrvGroup._GetService("test","123");

Log.d(TAG,"zjy Service:"+Service);

if( Service == null ){ // the service has not been initialized

Log.d(TAG,"zjy Service is null");

Service = starcore._InitSimple("test", "123", 0, 0);

}else{

Log.d(TAG,"zjy SrvGroup:"+SrvGroup);

Service._CheckPassword(false);

}

Service._CheckPassword(false);

/*----run python code----*/

SrvGroup._InitRaw("python37", Service); // this place

python = Service._ImportRawContext("python", "", false, "");

StarObjectClass model = python._GetObject("pd");

python._Call("import", "sys");

StarObjectClass pythonSys = python._GetObject("sys");

StarObjectClass pythonPath = (StarObjectClass) pythonSys._Get("path");

pythonPath._Call("insert", 0, appFile.getPath()+ File.separator +"python3.7.zip");

pythonPath._Call("insert", 0, appLib);

pythonPath._Call("insert", 0, appFile.getPath());

starcore._SRPUnLock();

}

private void runPy() {

//调用Python代码

Service._DoFile("python", appFile.getPath() + "/py_code.py", "");

long time = python._Calllong("get_time");

Log.d(TAG, "form python time="+time);

Service._DoFile("python", appFile.getPath() + "/test.py", "");

int result = python._Callint("add", 5, 2);

Log.d(TAG, "result="+result);

python._Set("JavaClass", Log.class);

Service._DoFile("python", appFile.getPath() + "/calljava.py", "");

}

private void copyFile(Activity c, String Name) {

File outfile = new File(c.getFilesDir(), Name);

BufferedOutputStream outStream = null;

BufferedInputStream inStream = null;

try {

outStream = new BufferedOutputStream(new FileOutputStream(outfile));

inStream = new BufferedInputStream(c.getAssets().open(Name));

byte[] buffer = new byte[1024 * 10];

int readLen = 0;

while ((readLen = inStream.read(buffer)) != -1) {

outStream.write(buffer, 0, readLen);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (inStream != null) inStream.close();

if (outStream != null) outStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

private void copyFileFromSdcard(Activity c, String Name) {

File outfile = new File(c.getFilesDir(), Name);

BufferedOutputStream outStream = null;

BufferedInputStream inStream = null;

InputStream  redis = null;

try {

String sdpath =       Environment.getExternalStorageDirectory().getAbsolutePath();

String filePath = sdpath +File.separator + Name;

redis = new FileInputStream(new File(filePath));

outStream = new BufferedOutputStream(new FileOutputStream(outfile));

inStream = new BufferedInputStream(redis);

byte[] buffer = new byte[1024 * 10];

int readLen = 0;

while ((readLen = inStream.read(buffer)) != -1) {

outStream.write(buffer, 0, readLen);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (inStream != null) inStream.close();

if (outStream != null) outStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

@Override

protected void onStart() {

super.onStart();

Log.d(TAG,"onStart");

}

@Override

protected void onResume() {

super.onResume();

Log.d(TAG,"onResume");

}

@Override

protected void onPause() {

super.onPause();

Log.d(TAG,"onPause");

}

@Override

protected void onDestroy() {

super.onDestroy();

Log.d(TAG,"onDestroy X");

starcore._ModuleClear();

//        starcore._ModuleExit();

Log.d(TAG,"onDestroy E");

}

}

android开发调用python脚本相关教程

安卓开发调用python脚本_android开发调用python脚本相关推荐

  1. 安卓开发fragment报错_android开发 Fragment嵌套调用常见错误

    在activity中有时需要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子f ...

  2. 安卓打开java文件管理器_Android开发之简单文件管理器实现方法

    本文实例讲述了Android开发之简单文件管理器实现方法.分享给大家供大家参考,具体如下: 这里运用Java I/O.ListActivity.Dialog.Bitmap等实现简单文件管理器,可以查看 ...

  3. 安卓如何调出软键盘_Android开发中软键盘的显示和隐藏

    本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示软键盘的实现方法,并且对其中重要的代码做了详细分析. 一.开篇 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求.开篇明义,本文 ...

  4. java安卓6.0闪退_Android开发activity跳转闪退

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 现在调试也是闪退 Java.lang.RuntimeException: Fail to connect to camera service at and ...

  5. 安卓 mysql读取图片路径_android开发之数据库存取图片

    Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢 ...

  6. Java开发关于UI界面_Android开发1:基本UI界面设计——布局和组件

    前言 啦啦啦~本学期要开始学习Android开发啦~ 博主在开始学习前是完完全全的小白,只有在平时完成老师要求的实验的过程中一步一步学习~从此篇博文起,博主将开始发布Android开发有关的博文,希望 ...

  7. android开发 获取相册名称_Android开发之获取相册照片和获取拍照照片

    在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取照片: ...

  8. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  9. python 调用event handler_扣丁学堂Python开发之调用语音模块时报错及解决方法

    扣丁学堂Python开发之调用语音模块时报错及解决方法 2018-03-09 11:45:57 3346浏览 python调用语音模块时,遇见TypeError:NoneTypetakesnoargu ...

  10. python调用linuxapi_Linux上使用python调用WPS二次开发接口

    原文链接Linux上使用python调用WPS二次开发接口 - C++ Programer​www.cryfeifei.cn 环境Ubuntu18.04 WPS For Linux Python3 简 ...

最新文章

  1. 独家 | 一文带你读懂特征工程!
  2. SAP MM MIGO Cancellation可以用于冲销上次冲销而产生的物料凭证
  3. elementui tree组件层级过多时可左右滚动
  4. Linux中的Screen命令使用技巧详解
  5. OSPF(Open Shortest Path First开放式最短路径优先)
  6. 2.4时序卷积网络TCN:因果膨胀卷积、残差连接和跳过连接
  7. 新手如何学习PLC编程?
  8. python内置函数sorted()
  9. 【 OpenCV】——图像平移
  10. (附源码)springboot垃圾自动分类管理系统 毕业设计 160846
  11. 2021年度总结及2022展望
  12. win7还原关闭计算机,怎么关闭系统还原,教您win7怎么关闭系统还原
  13. 货币转换python代码_在Python中创建货币转换器
  14. ppt输出图片更改分辨率设置
  15. 《Windows 8 权威指南》——2.2 Windows 8 Metro界面
  16. 【详细】用Python的pyttsx3、pygame和PySimpleGUI库实现文字转语音工具(无需网络接口)
  17. 怎么用蓝光u宝装linux系统,蓝光U宝U盘启动盘制作工具V3.3(完整版)使用教程
  18. 毕达哥拉斯的面包规矩
  19. 计算机与外设维修初级,计算机的外设维修实例论文.docx
  20. 海康设备对接sdk错误码汇总 v6.0

热门文章

  1. 电信dns地址是多少?
  2. 工作第一年的所见所闻所学所想
  3. sublime text3 3207 下载安装破解
  4. 前端图片压缩(几乎无损)
  5. Win10怎么搜索文件内容?Win10通过文件内容查找文件的方法
  6. 数据分析师培训班哪家好?
  7. 考研高数——牛顿-莱布尼茨公式(N-L公式)的证明
  8. 【游戏开发】UE4联机渲染swarm agent配置
  9. 冯扬文:基于数据仓库的集装箱运价信息集成研究
  10. 双系统彻底删除Ubuntu启动项