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. 《k8s-1.13版本源码分析》- Informer 机制

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  2. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  3. ES6数组扩展运算符

    1 扩展运算符的运用 (1)复制数组 数组是复合的数据类型,直接复制的话,只是复制了指向底层数据机构的指针,而不是克隆一个全新的数组; const a1=[1,2]; const a2= a1; a2 ...

  4. Fundebug支付宝小程序BUG监控插件更新至0.2.0,新增test()方法,报错增加Page数据

    摘要: 0.2.0新增fundebug.test()方法,同时报错增加了Page数据. Fundebug提供专业支付宝小程序BUG监控服务,可以第一时间为您捕获生存环境中小程序的异常.错误或者BUG, ...

  5. Intellij idea 离线安装activiti工作流插件

    想在Intellij idea上安装一个activiti插件玩玩,由于网络环境原因,不能使用网上已有的在线搜索acti bpm并安装的方式.也在网上找了好久没找到离线安装的方式.自己摸索了一下装好了, ...

  6. Windows系统ping本地虚拟机~

    虚拟机左上角[编辑]>>>[虚拟网络编辑器] [VMnet1]>>>子网ip:192.168.124.0 子网掩码:255.255.255.0 [VMnet8]&g ...

  7. Visual Studio Code快速删除空行及几个常用快捷键总结

    在使用notepad++工具的时候,很多情况下我们会遇到批量替换空行的操作,之前的操作方法是快捷键Crtl+h调出窗口选择替换栏,在查找目标栏中输入\r\n\r\n,替换为 栏中输入\r\n并选择全部 ...

  8. 网络协议 16 - DNS 协议:网络世界的地址簿

    [前五篇]系列文章传送门: 网络协议 11 - Socket 编程(下):眼见为实耳听为虚 网络协议 12 - HTTP 协议:常用而不简单 网络协议 13 - HTTPS 协议:加密路上无尽头 网络 ...

  9. java游戏开发杂谈 - java是什么

    java是一门编程语言, 它有三个开发平台:j2ee.j2se. j2me.(其实android也算一个了)      j2ee, 也就是web开发,比如网站.各类管理系统,主要是围绕数据库.网页等进 ...

  10. 如何开发AR增强现实应用与产品

    2016年被称为VR元年,可见火爆程度,但是我要告诉你,其实还有一种技术AR(增强现实)技术,才是下一个真正的“风口”技术.可以预见的是,未来AR应用爆发之时,必将超越VR产业规模,开拓千亿级市场空间 ...