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代码(带参数)的更多相关文章

  1. 如何在Java中调用Python代码

    有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...

  2. 在Java中调用Python代码

    极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...

  3. 在Android开发中调用Rest web服务(转)

    首先从维基百科上拷贝一点Rest的基本概念给大家看看,然后我们再开始详解在Android中如何调用Rest服务.表象化状态转变(英文:Representational State Transfer,简 ...

  4. 『Python CoolBook』C扩展库_其六_从C语言中调用Python代码

    点击进入项目 一.C语言运行pyfun的PyObject对象 思路是在C语言中提供实参,传给python函数: 获取py函数对象(PyObject),函数参数(C类型) 获取GIL(PyGILStat ...

  5. 嵌入Python | 调用Python模块中有参数的函数

    开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...

  6. java调用python代码

    同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...

  7. android开发中系统自带语音模块的使用

    android开发中系统自带语音模块的使用需求:项目中需要添加语音搜索模块,增加用户体验解决过程:在网上搜到语音搜索例子,参考网上代码,加入到了自己的项目,完成产品要求.这个问题很好解决,网上能找到很 ...

  8. 如何在Android开发中让你的代码更有效率

    最近看了Google IO 2012年的一个视频,名字叫做Doing More With Less: Being a Good Android Citizen,主要是讲如何用少少的几句代码来改善And ...

  9. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...

随机推荐

  1. Python3|ddt|unittest|浅议数据驱动测试

    目录 1.DDT简介 2.data装饰器 3.unpack装饰器 4.file_data装饰器 5.总结 1.DDT简介 Data-Driven Tests(DDT)即数据驱动测试.它允许您通过不同的 ...

  2. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

  3. [PHP]日志处理error_log()函数和配置使用

    1.error_log($message,$message_type,$destination,$extra_headers)函数, 2.message_type 是0,发送信息到php.ini配置的 ...

  4. Spring Boot入门(二):使用Profile实现多环境配置管理&如何获取配置文件值

    在上一篇博客Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件中,我们新建了一个最原始的Spring Boot项目,并使用了更为流行的yaml配置文件. ...

  5. php一致性hash算法的应用

    阅读这篇博客前首先你需要知道什么是分布式存储以及分布式存储中的数据分片存储的方式有哪些? 分布式存储系统设计(2)—— 数据分片 阅读玩这篇文章后你会知道分布式存储的最优方案是使用 一致性hash算法 ...

  6. Java关于读取Excel文件~xlsx xls csv txt 格式文件~持续汇总~

    所需的jar百度网盘链接:https://pan.baidu.com/s/146mrCImkZVvi1CJ5KoiEhQ提取码:c329 1 需要导入jar包,缺1不可 dom4j-1.6.1.jar ...

  7. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限

    上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...

  8. Windows提示 错误: RPC 服务器不可用 解决方法。

    试验环境: 本地主机:win10  ip:192.168.0.10 远程主机: win2008 R2   ip:192.168.1.128 我想要通过systeminfo去获取远程主机的系统信息,但是 ...

  9. winform 实现类似于TrackBar的自定义滑动条,功能更全

    功能很全,随便列几个 1.可以设置滑块的大小,边框颜色.背景色.形状等等吧 2.可以设置轨道的方向.边框颜色.背景色.阴影等等 ... 效果图: 下载链接https://download.csdn.n ...

  10. 教你如何把openfire的muc聊天室改造为群

    openfire群聊与QQ群对比 应该是去年的时候开始接触openfire,当时在分析后发现基于xmpp协议的openfire已经具备了群聊的功能.也就没太当回事,觉得加点功能就可以做成类似于QQ群的 ...