不学网

 找回密码
 立即注册

手机号码,快捷登录

查看: 262|回复: 0

[java] android通过jni壳调用python

[复制链接]
rain1994 发表于 2018-7-8 19:54:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
1.下载crystax-ndk-10.3.2,解压到合适位置
2.下载pybridge地址https://github.com/joaoventura/pybridge
3.cmd 进入app\src\main\jni目录执行crystax-ndk-10.3.2目录里的ndk-build.cmd(crystax-ndk-10.3.2加入环境变量直接输入ndk-build.cmd)
4.编写python代码添加路由和对应的方法
  1. """
  2. This file is executed when the Python interpreter is started.
  3. Use this file to configure all your necessary python code.

  4. """
  5. # -*- coding:utf-8 -*-
  6. # import urllib.request
  7. import json


  8. def router(args):
  9.     """
  10.     Defines the router function that routes by function name.

  11.     :param args: JSON arguments
  12.     :return: JSON response
  13.     """
  14.     values = json.loads(args)

  15.     try:
  16.         function = routes[values.get('function')]

  17.         status = 'ok'
  18.         res = function(values)
  19.     except KeyError:
  20.         status = 'fail'
  21.         res = None

  22.     return json.dumps({
  23.         'status': status,
  24.         'result': res,
  25.     })


  26. def greet(args):
  27.     """Simple function that greets someone."""
  28.     return 'Hello %s' % args['name']


  29. def add(args):
  30.     """Simple function to add two numbers."""
  31.     return args['a'] + args['b']


  32. def mul(args):
  33.     """Simple function to multiply two numbers."""
  34.     return args['a'] * args['b']

  35. def gethtml(args):
  36.     #url = 'http://www.baidu.com/'
  37.     #headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
  38.                         #'Chrome/51.0.2704.63 Safari/537.36'}
  39.     #req = urllib.request.Request(url,headers=headers)
  40.     #response= urllib.request.urlopen(req)
  41.     #data =response.read()
  42.     #html = data
  43.     #return html.decode()

  44.     # return str(routes)
  45.     return 'android 调用python'

  46. routes = {
  47.     'greet': greet,
  48.     'add': add,
  49.     'mul': mul,
  50.     'gethtml':gethtml
  51. }
复制代码
5.java中调用

  1. package com.jventura.pyapp;

  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;

  5. import com.jventura.pybridge.AssetExtractor;
  6. import com.jventura.pybridge.PyBridge;

  7. import org.json.JSONException;
  8. import org.json.JSONObject;


  9. public class MainActivity extends AppCompatActivity {

  10.     @Override
  11.     protected void onCreate(Bundle savedInstanceState) {
  12.         super.onCreate(savedInstanceState);
  13.         setContentView(R.layout.activity_main);

  14.         // Extract python files from assets
  15.         AssetExtractor assetExtractor = new AssetExtractor(this);
  16.         assetExtractor.removeAssets("python");
  17.         assetExtractor.copyAssets("python");

  18.         // Get the extracted assets directory
  19.         String pythonPath = assetExtractor.getAssetsDataDir() + "python";

  20.         // Start the Python interpreter
  21.         PyBridge.start(pythonPath);

  22.         // Call a Python function
  23.         try {
  24.             JSONObject json = new JSONObject();
  25.             json.put("function", "gethtml");
  26.             json.put("name", "Python 3.5");

  27.             JSONObject result = PyBridge.call(json);
  28.             String answer = result.getString("result");

  29.             TextView textView = (TextView) findViewById(R.id.textView);
  30.             textView.setText(answer);

  31.         } catch (JSONException e) {
  32.             e.printStackTrace();
  33.         }

  34.         // Stop the interpreter
  35.         PyBridge.stop();
  36.     }
  37. }
复制代码


6.查看运行结果


7.不足之处,pthon包不完整,爬虫测试发现少了一些包(比如会报错pybridge: ImportError: No module named '_socket')

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|不学网

GMT+8, 2018-9-26 19:27

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表