从 kivy 导入 pyjnius
Posted
技术标签:
【中文标题】从 kivy 导入 pyjnius【英文标题】:Import pyjnius from kivy 【发布时间】:2016-09-05 10:55:56 【问题描述】:我想问一下是否可以只从 Kivy 导入 jnius。我将 Python 用于 android “qpython” 发行版,其中编译了 Kivy。 Kivy 也包含 pyjnius。 现在我尝试使用 jnius 而不调用 Kivy 应用程序来调用 Java 模块?任何想法调用 kivy 包含模块而不导入 Kivy 本身或仅在终端中使用 Kivy 而不调用应用程序或窗口?或者直接为qpython编译pyjnius的一些帮助?谢谢
【问题讨论】:
【参考方案1】:Pyjnius 是一个独立的模块,它不依赖于 Kivy。它确实依赖于以某种方式获取JNIEnv*
,而 pyjnius 目前通过 SDL 函数进行硬编码(尽管即使 SDL 的事件循环实际上没有运行,这也可能有效)。
我不确定您实际上在询问您的应用程序将如何运行(如果它在 qpython 中,pyjnius 无论如何都不能工作吗?),但通常很容易修改它以获取不同的指针方式(尽管您需要一些 C 代码来管理它)。这是python-for-android使用的方法,它修补了pyjnius以使用适当的api。
【讨论】:
如果我只是尝试:import jnius
我得到:Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/QPython/QPython2-core/build/python-install/lib/python2.7/site-packages/jnius/__init__.py", line 13, in <module> File "/QPython/QPython2-core/build/python-install/lib/python2.7/site-packages/jnius/reflect.py", line 9, in <module> File "jnius_export_class.pxi", line 44, in jnius.jnius.MetaJavaClass.__new__ (jnius/jnius.c:13255) SystemError: NULL result without error in PyObject_Call >>>
我不知道到底出了什么问题,但也许我错了它在没有其他东西运行的情况下工作。它在没有 Kivy 和 SDL 的情况下运行良好,即使 qpython 有问题,也没有主要的依赖关系。【参考方案2】:
这是qpython的问题。只有在脚本前面添加此代码时才能使用 pyjnius:
#qpy:kivy
例如:
#-*-coding:utf8;-*-
#qpy:2
#qpy:kivy
from kivy.app import App
from kivy.uix.button import Button
from jnius import autoclass
MediaPlayer = autoclass('android.media.MediaPlayer')
player=MediaPlayer()
media="/storage/emulated/legacy/YOUR_MEDIA_FILE"
def reset_player():
if (player.isPlaying()):
player.stop()
player.reset()
def restart_player(_):
reset_player()
try:
player.setDataSource(media)
player.prepare()
player.start()
except:
player.reset()
class App(App):
def build(self):
return Button(text='Hello world!',on_release=restart_player)
if __name__=="__main__":
App().run()
希望对您有所帮助!
【讨论】:
以上是关于从 kivy 导入 pyjnius的主要内容,如果未能解决你的问题,请参考以下文章
为啥除了 jnius 我不能导入任何 pyjnius 的东西?
如何使用 kivy、pyjnius 为 android 制作 GPS 应用程序?