PyJNIus 是一个 Python 库,用于使用 Java 本机接口 (JNI) 访问 Java 类。
PyJNIus 由 Kivy 团队管理,可以与 python-for-android 一起使用。
它还可以独立于 Kivy 在桌面和移动平台上使用。
警告
PyPI 包名称现在是 pyjnius 而不是jnius
。
pip install pyjnius
> >> from jnius import autoclass
> >> autoclass ( 'java.lang.System' ). out . println ( 'Hello world' )
Hello world
>> > Stack = autoclass ( 'java.util.Stack' )
> >> stack = Stack ()
> >> stack . push ( 'hello' )
> >> stack . push ( 'world' )
> >> print ( stack . pop ())
world
> >> print ( stack . pop ())
hello
然后,你可以做这样的事情:
from time import sleep
from jnius import autoclass
Hardware = autoclass ( 'org.renpy.android.Hardware' )
print ( 'DPI is' , Hardware . getDPI ())
Hardware . accelerometerEnable ( True )
for x in range ( 20 ):
print ( Hardware . accelerometerReading ())
sleep ( 0.1 )
它会输出类似以下内容:
I/python ( 5983): Android kivy bootstrap done. __name__ is __main__
I/python ( 5983): Run user program, change dir and execute main.py
I/python ( 5983): DPI is 160
I/python ( 5983): [0.0, 0.0, 0.0]
I/python ( 5983): [-0.0095768067985773087, 9.3852710723876953, 2.2218191623687744]
I/python ( 5983): [-0.0095768067985773087, 9.3948478698730469, 2.2218191623687744]
I/python ( 5983): [-0.0095768067985773087, 9.3948478698730469, 2.2026655673980713]
I/python ( 5983): [-0.028730420395731926, 9.4044246673583984, 2.2122423648834229]
I/python ( 5983): [-0.019153613597154617, 9.3852710723876953, 2.2026655673980713]
I/python ( 5983): [-0.028730420395731926, 9.3852710723876953, 2.2122423648834229]
I/python ( 5983): [-0.0095768067985773087, 9.3852710723876953, 2.1835119724273682]
I/python ( 5983): [-0.0095768067985773087, 9.3756942749023438, 2.1835119724273682]
I/python ( 5983): [0.019153613597154617, 9.3948478698730469, 2.2122423648834229]
I/python ( 5983): [0.038307227194309235, 9.3852710723876953, 2.2218191623687744]
I/python ( 5983): [-0.028730420395731926, 9.3948478698730469, 2.2026655673980713]
I/python ( 5983): [-0.028730420395731926, 9.3852710723876953, 2.2122423648834229]
I/python ( 5983): [-0.038307227194309235, 9.3756942749023438, 2.2026655673980713]
I/python ( 5983): [0.3926490843296051, 9.3086557388305664, 1.3311761617660522]
I/python ( 5983): [-0.10534487664699554, 9.4331550598144531, 2.1068975925445557]
I/python ( 5983): [0.26815059781074524, 9.3469638824462891, 2.3463177680969238]
I/python ( 5983): [-0.1149216815829277, 9.3852710723876953, 2.31758713722229]
I/python ( 5983): [-0.038307227194309235, 9.41400146484375, 1.8674772977828979]
I/python ( 5983): [0.13407529890537262, 9.4235782623291016, 2.2026655673980713]
当您使用autoclass
时,它将发现该类的所有方法和字段并解析它们。您可能只想声明和使用您需要的内容。前面的示例可以手动完成,如下所示:
from time import sleep
from jnius import MetaJavaClass , JavaClass , JavaMethod , JavaStaticMethod
class Hardware ( JavaClass ):
__metaclass__ = MetaJavaClass
__javaclass__ = 'org/renpy/android/Hardware'
vibrate = JavaStaticMethod ( '(D)V' )
accelerometerEnable = JavaStaticMethod ( '(Z)V' )
accelerometerReading = JavaStaticMethod ( '()[F' )
getDPI = JavaStaticMethod ( '()I' )
# use that new class!
print ( 'DPI is' , Hardware . getDPI ())
Hardware . accelerometerEnable ()
for x in range ( 20 ):
print ( Hardware . accelerometerReading ())
sleep ( 0.1 )
您可以使用JavaMethod
和JavaMultipleMethod
的signatures
方法来检查对象方法的发现签名
> >> String = autoclass ( 'java.lang.String' )
> >> dir ( String )
[ 'CASE_INSENSITIVE_ORDER' , '__class__' , '_JavaClass__cls_storage' , '__delattr__' , '__dict__' , '__dir__' , '__doc__' , '__eq__' , '__format__' , '__ge__' , '__getattribute__' , '__gt__' , '__hash__' , '__init__' , '__init_subclass__' , '__javaclass__' , '__javaconstructor__' , '__le__' , '__lt__' , '__module__' , '__ne__' , '__new__' , '__pyx_vtable__' , '__reduce__' , '__reduce_ex__' , '__repr__' , '__setattr__' , '__setstate__' , '__sizeof__' , '__str__' , '__subclasshook__' , '__weakref__' , 'charAt' , 'checkBounds' , 'clone' , 'codePointAt' , 'codePointBefore' , 'codePointCount' , 'compareTo' , 'compareToIgnoreCase' , 'concat' , 'contains' , 'contentEquals' , 'copyValueOf' , 'empty' , 'endsWith' , 'equals' , 'equalsIgnoreCase' , 'finalize' , 'format' , 'getBytes' , 'getChars' , 'getClass' , 'hashCode' , 'indexOf' , 'indexOfSupplementary' , 'intern' , 'isEmpty' , 'join' , 'lastIndexOf' , 'lastIndexOfSupplementary' , 'length' , 'matches' , 'nonSyncContentEquals' , 'notify' , 'notifyAll' , 'offsetByCodePoints' , 'regionMatches' , 'registerNatives' , 'replace' , 'replaceAll' , 'replaceFirst' , 'split' , 'startsWith' , 'subSequence' , 'substring' , 'toCharArray' , 'toLowerCase' , 'toString' , 'toUpperCase' , 'trim' , 'valueOf' , 'wait' ]
> >> String . format . signatures ()
[([ 'java/util/Locale' , 'java/lang/String' , 'java/lang/Object...' ], 'java/lang/String' ), ([ 'java/lang/String' , 'java/lang/Object...' ], 'java/lang/String' )]
每对包含接受的参数类型列表和返回的类型。
如果您想在桌面上使用 PyJNIus,请确保您的操作系统上安装了 Java 开发工具包 (JDK)。众所周知,OpenJDK 可以工作,Oracle Java JDK 也应该可以工作。
在 Windows 上,确保JAVA_HOME
指向您的 Java 安装,以便 PyJNIus 可以找到jvm.dll
文件,从而启动 Java。这在 macOS 和 Linux 上不是必需的,但如果 PyJNIus 找不到它,设置JAVA_HOME
应该会有所帮助。
PyJNIus 获得 MIT 许可,由优秀社区积极开发,并得到 Kivy 组织管理的许多项目的支持。
该存储库的文档。
您在 Kivy 生态系统中使用 PyJNIus 或其任何相关项目时遇到问题吗?有没有你不明白的错误?您是否想弄清楚如何使用它?我们有志愿者可以提供帮助!
最新的联系我们文档中列出了联系我们获取支持的最佳渠道。
PyJNIus 是 Kivy 生态系统的一部分 - 一个由成千上万的开发人员免费使用的大型产品组,但它完全由志愿者的贡献构建。我们欢迎(并依赖)希望通过为项目做出贡献来回馈社区的用户。
贡献可以有多种形式。请参阅最新的贡献指南,了解如何帮助我们。
为了培育一个开放和热情的社区,我们作为贡献者和维护者需要确保参与我们的项目和我们的姐妹项目对每个人来说都是一种无骚扰和积极的体验。至关重要的是,所有互动都必须以表达尊重、开放和感激的方式进行。
请查阅最新的行为准则。
这个项目的存在要感谢所有做出贡献的人。 [成为贡献者]。
感谢我们所有的支持者! [成为支持者]
特别感谢我们过去和现在的所有赞助商。通过[成为赞助商]支持该项目。
以下是我们当前的顶级赞助商。请点击查看他们的网站,并像他们支持我们一样支持他们。