android开发中调用python代码(带参数)
android开发主要用到的是java代码,但是当开发涉及到一些算法时,往往用python可以提高软件的运行速度,也更加便捷,这里分享自己项目调用python代码的方式,主要有以下几个步骤(个人方法,欢迎指教):
1:配置调用环境
2:创建一个pythonHelper类用于搭建一个传参的桥梁:
3:拿到python文件,python代码中必须包含所需要调用的方法,参数和返回值必须对应好。否则会报空指针错误。
4:因为配置好了环境,再编写一段python环境下的代码来完成调用。
5:java中调用
第一步代码如下:(这里用的版本是python3.4版本)
private void loadPyFiles(File appFile, String appLib) {
File pyLibFile = new File(appFile, "python3.4.zip");
if (!pyLibFile.exists()) {
copyFileOfAssets(getApplicationContext(), "python3.4.zip");
copyFileOfAssets(getApplicationContext(), "_struct.cpython-34m.so");
copyFileOfAssets(getApplicationContext(), "binascii.cpython-34m.so");
copyFileOfAssets(getApplicationContext(), "time.cpython-34m.so");
copyFileOfAssets(getApplicationContext(), "zlib.cpython-34m.so");
} copyFileOfAssets(getApplicationContext(), "code_test.py");
// copyFileOfAssets(getApplicationContext(), "MTool.py");
// copyFileOfAssets(getApplicationContext(), "cardCombine_2.py");
copyFileOfAssets(getApplicationContext(), "pro_num_3.py"); copyFileOfAssets(getApplicationContext(), "penghu.py");
copyFileOfAssets(getApplicationContext(), "PengHu_Main.py"); System.loadLibrary("python3.4m"); StarCoreFactoryPath.StarCoreCoreLibraryPath = appLib;
StarCoreFactoryPath.StarCoreShareLibraryPath = appLib;
StarCoreFactoryPath.StarCoreOperationPath = appFile.getPath(); StarCoreFactory starFactory = StarCoreFactory.GetFactory();
mStarService = starFactory._InitSimple("test", "123", 0, 0);
mStarSrvGroup = (StarSrvGroupClass) mStarService._Get("_ServiceGroup");
mStarService._CheckPassword(false); mStarSrvGroup._InitRaw("python34", mStarService);
mStarPython = mStarService._ImportRawContext("python", "", false, "");
mStarPython._Call("import", "sys");
StarObjectClass pythonSys = mStarPython._GetObject("sys");
StarObjectClass pythonPath = (StarObjectClass) pythonSys._Get("path");
pythonPath._Call("insert", 0, appFile.getPath() + File.separator
+ "python3.4.zip");
pythonPath._Call("insert", 0, appLib);
pythonPath._Call("insert", 0, appFile.getPath());
} private void copyFileOfAssets(Context ctx, String name) {
File outfile = new File(ctx.getFilesDir(), name);
BufferedOutputStream mOutStream = null;
BufferedInputStream mInStream = null;
byte[] mBuffer = new byte[16 * 1024];
int readLen = 0;
try {
mOutStream = new BufferedOutputStream(new FileOutputStream(outfile));
mInStream = new BufferedInputStream(ctx.getAssets().open(name));
while ((readLen = mInStream.read(mBuffer)) != -1) {
mOutStream.write(mBuffer, 0, readLen);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (mOutStream != null) {
mOutStream.close();
}
if (mInStream != null) {
mInStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} private void do_python_cc(int[] cards, int tag) {
if (isPyLoaded) {
mStarService._DoFile("python", mAppFilePath + "/pro_num_3.py", "");
mStarService._DoFile("python", mAppFilePath + "/code_test.py", "");
mStarPython._Set("JavaClass", Log.class);
PythonHelper.setDataArr(cards, tag);
mStarPython._Set("PythonHelper", PythonHelper.class);
mStarPython._Call("python_cc");
}
}
第二步,创建pythonHelper类.(主要是要有get,set方法在后面调用,具体变量因项目而异,这里我直接根据自己项目贴代码,主要是将需要调用的参数拿到)
public class PythonHelper2 {
public static int[] mCards;
public static int mTag;public static int mTargetCard;
public static int mType;/**
*
* @param mCards
* @param mTag 0,1,2,3
* @param mDangerCards
* @param mOldCards
* @param mTargetCard
* @param type 1:CHI ,2:PENG
* @param mCountPeng
* @param mCountHu
*/
public static void setCards(int[] mCards,int mTag,int[] mDangerCards,int[] mOldCards,int mTargetCard,int type){
PythonHelper2.mCards = mCards;
mCardsLength = mCards==null?0:mCards.length;
PythonHelper2.mTag = mTag;
PythonHelper2.mTargetCard = mTargetCard;
PythonHelper2.mType = type;
} public static int[] getMatchCards(int[] result){
mMatchCards = result;
return mMatchCards;
}
}
第三步:拿到需要调用的python文件必须包含要调用的方法。(下面是
get_result方法,且参数类型和顺序,数量跟我们调用时一样
)
第四步;编写调用代码。(需要重新在python中得到参数,得到的方式数组和数值方式有差异,如果是数组需要重新遍历赋值。
python_java = Python_Main.Main_Founc(); def python_ph():
python_log("python_java 0000");
#1.input_list
param_len = PythonHelper.mCardsLength;
python_log("python_java 1111 mCards_len=%d"%(param_len));
input_list = [];
cards_index = 0;
while(cards_index < param_len):
val = PythonHelper.mCards[cards_index];
input_list.append(val);
cards_index = cards_index + 1;
#2.tags
tags=PythonHelper.mTag;
#3.danger_poke
param_len1 = PythonHelper.mDangerCardsLength;
python_log("python_java 2222 mDangerCards_len=%d"%(param_len1));
danger_poke=[];
cards_index1 = 0;
while(cards_index1 < param_len1):
val = PythonHelper.mDangerCards[cards_index1];
danger_poke.append(val);
cards_index1 = cards_index1 + 1;
#5.inter_poke
inter_poke = PythonHelper.mTargetCard;
#6.type
type=PythonHelper.mType;
#######
try:
python_cards = python_java.get_result(input_list,tags,danger_poke,inter_poke);
except Exception as e:
python_log("python error: "+str(e)+str(type(oldcards_no_peng)))
ccLen = len(python_cards);
python_log("python_java 6666 return cards size=%d"%(ccLen));
PythonHelper.getMatchCards(python_cards);
第五步,java中调用
private void getResultByPython(int[] input_list, int tags, int inter_poke,
int type,int[] dangerCards) {
int[] dangerCards = PlayCardEngine2.getInstance().getTableSnap()
.getVismDangerCards();if (isPyLoaded) {
mStarService._DoFile("python", mAppFilePath + "/penghu.py", "");
mStarService
._DoFile("python", mAppFilePath + "/PengHu_Main.py", "");
mStarPython._Set("JavaClass", Log.class);
PythonHelper2.setCards(input_list, tags, dangerCards, oldCards,
inter_poke, type, count_Peng, count_Hu, times, throwCards, myAndNextThrowCards);
mStarPython._Set("PythonHelper2", PythonHelper2.class);
mStarPython._Call("python_penghu");
} else {
Log.d("getResultByPython", "isPyLoaded : " + isPyLoaded);
}
}
需要用到的包和so:_struct.cpython-34m.so binascii.cpython-34m.so python3.4.zip time.cpython-34m.so zlib.cpython-34m.so (可以自行下载或者联系我)
因为项目中代码太多,我有做删减,所以以上代码会存在一些不齐全问题,但是关键的步骤是没错的。需要根据实际情况做修改。
本人也是萌新,欢迎互相探讨交流。
谢谢!!!!
android开发中调用python代码(带参数)的更多相关文章
- 如何在Java中调用Python代码
有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...
- 在Java中调用Python代码
极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...
- 在Android开发中调用Rest web服务(转)
首先从维基百科上拷贝一点Rest的基本概念给大家看看,然后我们再开始详解在Android中如何调用Rest服务.表象化状态转变(英文:Representational State Transfer,简 ...
- 『Python CoolBook』C扩展库_其六_从C语言中调用Python代码
点击进入项目 一.C语言运行pyfun的PyObject对象 思路是在C语言中提供实参,传给python函数: 获取py函数对象(PyObject),函数参数(C类型) 获取GIL(PyGILStat ...
- 嵌入Python | 调用Python模块中有参数的函数
开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...
- java调用python代码
同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...
- android开发中系统自带语音模块的使用
android开发中系统自带语音模块的使用需求:项目中需要添加语音搜索模块,增加用户体验解决过程:在网上搜到语音搜索例子,参考网上代码,加入到了自己的项目,完成产品要求.这个问题很好解决,网上能找到很 ...
- 如何在Android开发中让你的代码更有效率
最近看了Google IO 2012年的一个视频,名字叫做Doing More With Less: Being a Good Android Citizen,主要是讲如何用少少的几句代码来改善And ...
- Android开发中怎样调用系统Email发送邮件(多种调用方式)
在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...
随机推荐
- Redis数据结构和常用API
Redis是一个速度非常快的非关系型数据库,可以存储键与5中不同数据结构类型之间的映射.这5种数据结构分别是STRING(字符串).LIST(列表).SET(集合).HASH(散列).ZSET(有序集 ...
- WPF 小小案列(同步异步)
private void BtnButton_Click(object sender, RoutedEventArgs e) { MessageBox.Show("hello Word&qu ...
- c# 创建Excel com加载项图片对象批量操作
技术含量较低,主要是通过VBA代码转换成c#代码而来,从而实现图片批量插入.删除.另存为的批量操作,增加文档使用的通用性. 插件主要界面如下: 主要代码如下: private void button8 ...
- cesium 之加载地形图 Terrain 篇(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- Linux 用户及权限详解
Linux 用户及权限详解 用户 , 组 ,权限 安全上下文(secure context): 权限: r,w,x 文件: r : 可读,可以使用类似cat 等命令查看文件内容. w : 可写,可以编 ...
- 操作系统:diskpart常用指令(使用diskpart实现分区管理)
配合磁盘管理一起食用,效果最佳.(我的电脑右键 -> 管理 -> 磁盘管理) status:列出主要命令 list:列出list下的命令 select disk 0:选择第一块磁盘 lis ...
- gittalk报错Error
最近通过github和jekyll搭了一个博客,申请使用了gittalk的评论. 但是博客的页面一直报Error:Not found,如下 发现是gittalk中的信息填写错了,name随便写:Hom ...
- Linux 桌面玩家指南:12. 优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- 【RL-TCPnet网络教程】第41章 HTTP超文本传输协议基础知识
第41章 HTTP超文本传输协议基础知识 本章节为大家讲解HTTP(HyperText Transfer Protocol,超文本传输协议),从本章节开始,正式进入嵌入式Web的设计和学习. ...
- 基于vue-cli构建vue-router的入门级demo
前言 本案列仅针对刚刚入门vue学习的伙伴,博主也是刚刚在学基于vue-cli搭建脚手架项目,对于前端大牛,可以移步. 快速搭建vue-cli环境 如何搭建基于vue-cli项目,这里不再叙述,如果不 ...