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 生態系統的一部分 - 一個由成千上萬的開發人員免費使用的大型產品組,但它完全由志願者的貢獻構建。我們歡迎(並依賴)希望透過為專案做出貢獻來回饋社區的用戶。
貢獻可以有多種形式。請參閱最新的貢獻指南,了解如何協助我們。
為了培養一個開放和熱情的社區,我們作為貢獻者和維護者需要確保參與我們的計畫和我們的姊妹計畫對每個人來說都是一種無騷擾和積極的體驗。至關重要的是,所有互動都必須以表達尊重、開放和感激的方式進行。
請查閱最新的行為準則。
這個項目的存在要感謝所有做出貢獻的人。 [成為貢獻者]。
感謝我們所有的支持者! [成為支持者]
特別感謝我們過去和現在的所有贊助商。透過[成為贊助商]支持該計畫。
以下是我們目前的頂級贊助商。請點擊查看他們的網站,並像他們支持我們一樣支持他們。