<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Python中輕松調用Java方法-PyJNIus

汽車電子技術 ? 來源:Python實用寶典 ? 作者: Ckend ? 2023-02-24 13:49 ? 次閱讀

PyJNIus 是一個神奇的 Python 第三方模塊。它能使用Java本地接口將Java類作為Python類訪問的Python模塊。

如果你需要在Python中使用Java 類,這個第三方模塊是你最好的選擇。

1.準備

開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南 進行安裝。

如果你用Python的目的是數據分析,可以直接安裝Anaconda:Python數據分析與挖掘好幫手—Anaconda,它內置了Python和pip.

此外,推薦大家用VSCode編輯器,它有許多的優點:Python 編程的最好搭檔—VSCode 詳細指南。

請選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環境 打開 Cmd (開始-運行-CMD)。
  2. MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install pyjnius

2.快速開始

使用Jnius導入Java類特別簡單,你只需要引入 autoclass 并引用你所需要的類即可:

>>> 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

當你引入類后,你只需要按 Java 的函數操作即可,如上述代碼中的 push 和 pop 函數。

最令人驚喜的是,你還能在安卓系統中利用這個模塊使用Python調用Java類:

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 xrange(20):
    print(Hardware.accelerometerReading())
    sleep(.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]

為了能實現上述效果,你需要使用: python-for-android .

這是Android上Python應用程序的打包工具。您可以創建自己的Python發行版(包括所需的模塊和依賴項),并將其與自己的代碼捆綁在APK中。

詳細教程可以見GitHub:

https://github.com/kivy/python-for-android

3.進階使用

當您使用 autoclass 時,它將發現指定Java類的所有方法和字段并對其進行解析。如果你只想聲明和使用所需的內容??梢赃@么弄:

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')

# 使用這個新類
print('DPI is', Hardware.getDPI())

Hardware.accelerometerEnable()
for x in xrange(20):
    print(Hardware.accelerometerReading())
    sleep(.1)

這種形式支持你只引入你想要使用的類,不會造成資源浪費,代碼效率更高。

尤其是對于安卓系統有限的資源而言,推薦使用這種局部引入的方式。

當然,如果你是桌面系統(windows, macOS),資源相對充足,使用autoclass引入的方式是可以接受的。

不過,在Windows上,確保 JAVA_HOME 指向你的Java安裝路徑,以便 PyJNIus 可以找到 jvm.dll.

我們的文章到此就結束啦,如果你喜歡今天的Python 實戰教程,請持續關注Python實用寶典。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    7829

    瀏覽量

    148907
  • JAVA
    +關注

    關注

    19

    文章

    2908

    瀏覽量

    103133
  • python
    +關注

    關注

    52

    文章

    4697

    瀏覽量

    83589
收藏 人收藏

    評論

    相關推薦

    Python調用Java擴展包HanLP測試記錄

    、神經網絡依存句法分析)。由于自己才疏學淺,對JAVA方面了解不多,所以打算在Python環%2, line 5, in <module>startJVM
    發表于 12-12 16:27

    nodejs與java的互調用方法

    nodejs 與java的互調用方法很多,我們可選的是使用oracle 新的vm 引擎(graalvm很不錯) 還有就是基于browserify進行包裝,同時給java 提供一套req
    發表于 11-04 07:31

    Python的類方法、實例方法和靜態方法?

    Python實例屬性和實例方法Python類屬性和類方法
    發表于 11-05 06:25

    Android NDK編程--- C/C++調用Java不同類的靜態方法

    前言上一篇我們介紹了《Android NDK編程(四)--- C/C++調用Java方法》,主要是C/C++
    發表于 07-02 07:56

    后端選擇 java, 還是 python?

    容易學習和容易上手,所以學習成本略高于 Python。其次,雖然 Java 市面上招聘很多,這也導致了學習 Java 的人特別多,Java
    發表于 09-26 14:07

    C/C++調用Java不同類的靜態方法有哪些

    C/C++調用Java不同類的靜態方法有哪些?C/C++調用
    發表于 09-30 08:12

    如何用java映射創建java對象和調用java對象呢

    java是一種解析語言,java程序是通過java虛擬機解析.class的方式運行起來。因此,java中就存在java映射的概念。下面介紹如
    發表于 04-11 14:43

    如何用java映射創建java對象和調用java對象的方法

    java是一種解析語言,java程序是通過java虛擬機解析.class的方式運行起來。因此,java中就存在java映射的概念。一、首先我
    發表于 07-28 16:11

    JNI java調用so動態庫方法

    JNI Java調用so包相關問題總結,出現了很多問題,按照操作應該不會發生不到so包的錯誤,其實最后出現的也是說加載不到libpython2.7.x.so.1,我就納悶了,怎么和python扯上
    發表于 11-28 13:13 ?3328次閱讀

    一文看懂java如何寫接口給別人調用

    如何進行通信呢。什么意思呢,就是比如說我Java寫的一個方法,其他編程語言要怎么去調用呢?這就是本文要探討的問題了。
    的頭像 發表于 03-26 18:47 ?5.3w次閱讀

    Java方法調用Lua function

    Java先載入login.lua腳本并編譯,然后再獲取指定名稱的函數,無參的直接使用call()方法調用,帶參的需要通過invoke(LuaValue[])傳入參數表。
    的頭像 發表于 09-07 10:47 ?1097次閱讀

    java上位機開發(c庫調用)

    所有的動態語言,包括在java在內,一般都會提供一個調用c庫的方法。java語言的出現是在上個世紀90年代,而c/c++出現的時間要更早 一點,大約提前了20多年,所以在這過程當中積
    發表于 05-09 10:00 ?0次下載
    <b class='flag-5'>java</b>上位機開發(c庫<b class='flag-5'>調用</b>)

    Python環境搭建和LabVIEW中的調用

    本文主要介紹Python相關的環境搭建、Anaconda的使用以及在LabVIEW中調用Python方法。
    的頭像 發表于 10-13 17:56 ?945次閱讀
    <b class='flag-5'>Python</b>環境搭建和LabVIEW中的<b class='flag-5'>調用</b>

    PyJNIus:在Python輕松調用Java方法

    PyJNIus 是一個神奇的 Python 第三方模塊。它能使用Java本地接口將Java類作為Python類訪問的
    的頭像 發表于 10-30 11:32 ?337次閱讀

    PyJNIus :讓你在Python輕松調用Java方法

    PyJNIus 是一個神奇的 Python 第三方模塊。它能使用Java本地接口將Java類作為Python類訪問的
    的頭像 發表于 11-01 10:45 ?430次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>