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. Java集合详解7:HashSet,TreeSet与LinkedHashSet

    今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合 ...

  2. vue 中使用promise

    init1(){return new Promise((resolve, reject) => { let data={ dateStr:this.time }; api.get('url', ...

  3. SQL SERVER 查看所有存储过程或视图里 包含某个关键字的查询语句

    SELECT name, type_desc FROM sys.all_sql_modules s INNER JOIN sys.all_objects o ON s.object_id = o.ob ...

  4. linux 常用监控命令备注

    1.top 功能:查看系统各进程资源占用情况 备注:输入P后按照CPU占用排序显示:输入M后安装内存消耗排序 2.free 功能:查看内存占用情况 备注:无 3.df 功能:查看硬盘使用情况 备注:增 ...

  5. Objective-C 学习 (二):Objective-C 实战之Hello World

    在Objective-C 学习 (一):Objective-C 概述 学习了OC的基本知识,本节我们来实战一下: #import <Foundation/Foundation.h> // ...

  6. [Swift]浙大美女学霸征婚问题

    问题1:求乘积为(7140229933)的两个质数? Solution: import Foundation class Solution { func findBeauty(_ number:Int ...

  7. [Swift-2019力扣杯春季决赛]4. 有效子数组的数目

    给定一个整数数组 A,返回满足下面条件的 非空.连续 子数组的数目: 子数组中,最左侧的元素不大于其他元素. 示例 1: 输入:[1,4,2,5,3] 输出:11 解释:有 11 个有效子数组,分别是 ...

  8. 【Keras篇】---Keras初始,两种模型构造方法,利用keras实现手写数字体识别

    一.前述 Keras 适合快速体验 ,keras的设计是把大量内部运算都隐藏了,用户始终可以用theano或tensorflow的语句来写扩展功能并和keras结合使用. 二.安装 Pip insta ...

  9. 【TensorFlow篇】--Tensorflow框架初始,实现机器学习中多元线性回归

    一.前述 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,T ...

  10. Linux学习笔记--vi

    在Linux上使用vi命令修改一个文件内容的时候,发现无法保存,每次写完使用“:q!”命令可以正常退出但是使用":wq!"命令保存文件并退出时出现一下信息提示: E212: Can ...