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中 ...
随机推荐
- 数据结构与算法(九):AVL树详细讲解
数据结构与算法(一):基础简介 数据结构与算法(二):基于数组的实现ArrayList源码彻底分析 数据结构与算法(三):基于链表的实现LinkedList源码彻底分析 数据结构与算法(四):基于哈希 ...
- .NET 平台上C#语言的基本技术点
第一次用画图3D画的知识点,有点丑..........开始Csharp之路
- [PHP] sys_get_temp_dir()和tempnam()函数报错与环境变量的配置问题
1.项目运行过程中遇到个问题,保存临时文件时,一直返回false 2.根据经验这个是在/tmp目录下建立临时文件,所以检查了一遍权限问题,发现权限没有问题 3.查出sys_get_temp_dir() ...
- 【学习笔记Part 2● MySQL】
数据库 为什么要用数据库 如何去存放数据?生活中有各种各样的数据.比如说人的姓名.年龄.成绩等.平时我们记录这些信息都是记在大脑中.人的记忆力有限,不可能什么都记住.所以后来人们把数据记录在石头上–& ...
- Dynamics 365 CE命令栏按钮点击后刷新表单页面方法
微软动态CRM专家罗勇 ,回复326或者20190428可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...
- Windows Server 2016 安装虚拟机版黑群晖
硬件配置 Dell R730 CPU: Intel(R) Xeon(R) CPU E5-2603 v4 @1.70GHz(6 cores) Ram: 16Gb HDD: 系统-600GB SAS X2 ...
- DataPipeline加入Linux基金会下OpenMessaging社区
近日,国内领先的“iPaaS+AI”一站式大数据融合服务提供商DataPipeline宣布加入Linux基金会旗下OpenMessaging开源社区,将与OpenMessaging开源社区其他成员阿里 ...
- 2018~试试idea~
无聊~随便写了一个 输入控制台,发现点击run之后,反应要比eclipse慢一些,不知道是什么原因!!! 略略的操作了一下,还是和eclipse的使用习惯有很大的差异~
- 如何取消-"插入耳机自动显示提示框"
首先我们打开控制面板->1,你可以直接搜索控制面板打开 2,你可以右击我的电脑->点击属性->左上角打开控制面板
- #Java学习之路——基础阶段(第十一篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...