PyJNIus는 JNI(Java Native Interface)를 사용하여 Java 클래스에 액세스하기 위한 Python 라이브러리입니다.
PyJNIus는 Kivy 팀에서 관리하며 python-for-android와 함께 사용할 수 있습니다.
데스크톱 및 모바일 플랫폼에서 Kivy와 독립적으로 사용할 수도 있습니다.
경고
PyPI 패키지 이름은 이제 jnius
대신 pyjnius입니다.
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를 사용하려면 운영 체제에 JDK(Java Development Kit)가 설치되어 있는지 확인하세요. OpenJDK는 작동하는 것으로 알려져 있으며 Oracle Java JDK도 작동해야 합니다.
Windows에서는 JAVA_HOME
Java 설치를 가리키는지 확인하십시오. 그러면 PyJNIus가 jvm.dll
파일을 찾아서 Java를 시작할 수 있습니다. macOS 및 Linux에서는 이것이 필요하지 않지만 PyJNIus가 이를 찾지 못하는 경우 JAVA_HOME
설정하면 도움이 됩니다.
PyJNIus는 MIT 라이선스를 받았으며 훌륭한 커뮤니티에서 적극적으로 개발되었으며 Kivy 조직에서 관리하는 많은 프로젝트의 지원을 받습니다.
이 저장소에 대한 문서입니다.
Kivy 생태계에서 PyJNIus 또는 관련 프로젝트를 사용하는 데 문제가 있나요? 이해하지 못하는 오류가 있나요? 어떻게 사용하는지 알아내려고 노력하고 있나요? 도움을 줄 수 있는 자원봉사자가 있습니다!
지원을 위해 당사에 연락할 수 있는 가장 좋은 채널은 최신 문의처 문서에 나열되어 있습니다.
PyJNIus는 수천 명의 개발자가 무료로 사용하는 대규모 제품 그룹인 Kivy 생태계의 일부이지만 전적으로 자원봉사자들의 기여로 구축되었습니다. 우리는 프로젝트에 기여하여 커뮤니티에 환원하려는 사용자를 환영하고 의지합니다.
기여는 다양한 형태로 이루어질 수 있습니다. 귀하가 어떻게 우리를 도울 수 있는지 알아보려면 최신 기부 지침을 참조하세요.
개방적이고 환영받는 커뮤니티를 조성하기 위해 기여자이자 유지관리자로서 우리는 프로젝트와 자매 프로젝트에 대한 참여가 모든 사람에게 괴롭힘이 없고 긍정적인 경험이 되도록 보장해야 합니다. 모든 상호 작용은 존중, 열린 마음, 감사를 전달하는 방식으로 수행되는 것이 중요합니다.
최신 행동 강령을 참조하십시오.
이 프로젝트는 기여하는 모든 사람들 덕분에 존재합니다. [기여자가 되세요].
후원자 여러분 모두에게 감사드립니다! [후원자가 되세요]
과거와 현재의 모든 후원자들에게 특별한 감사를 드립니다. [스폰서가 되어] 이 프로젝트를 후원하세요.
현재 최고의 스폰서는 다음과 같습니다. 클릭하여 그들의 웹사이트를 살펴보고 그들이 우리를 지원하는 것처럼 그들을 지원하십시오.