์ ๋ JPype์ ์ฃผ ์ ์์ ๋๋ค. JPype ๋ฌธ์ ์ ๋ฐ์ดํธ์ ์ผํ์ผ๋ก JPype์ ๋ํ ๋์ฒด ์ฝ๋ ๋ชฉ๋ก์ PyJnius๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๋ถํํ๋ PyJnius๋ฅผ ๊ฐ์ง๊ณ ๋๊ณ 2์๊ฐ ํ์ JPype๋ณด๋ค PyJnius์ ์ฅ์ ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ์๊ฐํด๋ผ ์ ์์์ต๋๋ค. ํ๋ก์, ์ปค์คํฐ๋ง์ด์ , ๋ค์ฐจ์ ๋ฐฐ์ด ์ฒ๋ฆฌ, javadoc ํตํฉ, GC ์ฒ๋ฆฌ, ๋ฒํผ, ๊ณผํ์ ์ฝ๋ ํตํฉ(numpy, matplotlib ๋ฑ), ํธ์ถ์์ ๋ฏผ๊ฐํ ๋ฉ์๋, ๋ฌธ์ ๋ฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์คํ ์๋์์ ์ดํด๋ณธ ๋ชจ๋ ์ธก๋ฉด์ ํ์ฌ ๋ค๋ฃน๋๋ค. JPype์์๋ PyJnius๋ณด๋ค ๋ ์๋ฒฝํฉ๋๋ค. ํ์ง๋ง JPype์ ์ ์๊ฐ ๋๋ฉด์ PyJnius ํ์ ์ธก๋ฉด๋ณด๋ค๋ ์ ๊ฐ ๊ฐ์น ์๊ฒ ์ฌ๊ธฐ๋ ์ธก๋ฉด์ ๋ณด๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ํ๋ก์ ํธ์ ์ฅ์ ์ ๋ ์ ์ค๋ช ํ ์ ์์ต๋๊น? ์ด ํ๋ก์ ํธ์ ๊ฐ์น ์ ์์ ๋ฌด์์ด๋ฉฐ ๋์ ๊ณ ๊ฐ์ ๋ฌด์์ด๋ฉฐ ๋์์ด ์์ง ๋ค๋ฃจ์ง ์๋ ๋์์ ๋ฌด์์ ๋๊น?
๋ฌธ์ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ช ๋
๋์ jpype๋ฅผ ๋ณด์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ชป ๊ธฐ์ตํ ์ ์์ง๋ง ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ์๋ฒ(IPC)๋ฅผ ํตํด JVM๊ณผ ์ด์ผ๊ธฐํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์์ง๋ง readme๋ ๋ฐ๋๋ฅผ ์์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์ฝ๋๋ฅผ ํ ๋์ ๋ด๋ ๊ทธ๊ฒ์ ๋ฐ์ฆํ๋ ํํธ๋ฅผ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ง๋ ์์ ํ ํ๋ ธ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ฅผ ๋ค์ด ์๋๋ก์ด๋์์ ์๋ํ์ง ์๊ฒ ๋ง๋ค์์ต๋๋ค. ์ด๋ค ์ฌ๋๋ค์ ๋ฐ์คํฌํ ํ๋ซํผ์์ ๊ทธ๊ฒ์ ์ฌ์ฉํฉ๋๋ค). ๋ฐ๋ฉด์, jni.h๊ฐ AOSP์์ ๊ฐ์ ธ์จ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ native
๋๋ ํ ๋ฆฌ์ ๊ดํ ๊ฒ์ด ์๋๋ผ๋ฉด JPype ์ฝ๋๋ฒ ์ด์ค์์ Android ์ง์์ ๋ํ ํํธ๋ฅผ ๋ง์ด ๋ณผ ์ ์์ต๋๋ค.
ํ์ง๋ง ์์งํ ๋งํด์, ์ฐ๋ฆฌ๋ ํ๋ก์ ํธ๊ฐ ์์๋์์ ๋ JPype๋ฅผ ์ ํ ์ธ์ํ์ง ๋ชปํ์ต๋๋ค. kivy ์ง์์ ์ํด ํน์ ์๋๋ก์ด๋ ํด๋์ค์ ์ธํฐํ์ด์คํ๊ธฐ ์ํด ์๋์ผ๋ก jni ์ฝ๋๋ฅผ ์ฝ๋ฉํด์ผ ํ๋ ๊ฒ์์ ํ ๋จ๊ณ ๋ ์ฌ๋ผ๊ฐ ๊ฒ์ ๋๋ค. ๋๋ @tito ๊ฐ ๋์ค์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ํด ์๊ฒ ๋์์ ๋ ๋น๊ตํ๊ธฐ ์ํด ์ฝ๊ฐ์ ํ๊ณ ๋ฅผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๊ฐ ์ ํ์ ์๋ํ์ง ๋ง์์ผ ํ ๊ตฌ์ฒด์ ์ธ ์ด์ ๋ฅผ ๋ณด์๋์ง ๊ธฐ์ต์ด ๋์ง ์์ต๋๋ค.
์๋ ํ์ธ์. JPype ์ด๋ฆ์ ๊ธฐ์ต๋๋๋ฐ, ๋ญ ์ธ ์ ์๋์ง ๊ฒ์ํ ๋น์ ์์งํ 8๋ ์ ๋ง ํด๋ ์ ์ ํ ์ฌ์ฉํ์ง ์์๋์ง ๊ธฐ์ต์ด ์ ๋๋ค์ :) ์ฒ์์ ์ ์ผํ ๋ชฉํ๋ Android์ ํต์ ํ ์ ์๋ ๊ฒ์ด์์ต๋๋ค. API๋ฅผ ์ฌ์ฉํ์ง๋ง ์ค๊ฐ RPC ์๋ฒ๋ฅผ P4A ํ๋ก์ ํธ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๊ทธ ๋น์ ํ๊ณ ์์์ต๋๋ค.
์ ๋ ์ฝ 2๋ ์ ์ ๋ชจ๋ Java ๋ธ๋ฆฌ์ง ์ฝ๋์ ์ ๊ทผํ์ต๋๋ค. ๋ถํํ๋, PyJnius ์ฝ๋๋ ๋ด ๊ฒ์์ ๊ฒฐ์ฝ ๋ํ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ถ๋ช ํ ๋์ณค์ต๋๋ค. ์ง๋๋ฒ์ ๋ฉ์ง ๊ธฐ์ ๋ณด๋ ์๋ฃ๋ฅผ ์ ๊ณตํ ํ์ด์ง๋ฅผ ๊ฒ์ํ๋ค๊ฐ ๋ ํ๋ก์ ํธ์ ๋ํด ๋ ผ์ํ๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ ๊ฒ์ ์ ์ธํ๊ณ ๋ ์ด๋ฒ ๋ผ์ด๋์์๋ ๋์ณค์ ๊ฒ์ ๋๋ค. 2๋ ๋์ ๊ฐ์ ๋ถ์ผ์์ ์งํ ์ค์ธ ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ๋์ณค๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ถ๋ช ํ ๋ด ์๋ชป์ด์์ต๋๋ค.
JPype๊ฐ ๋ค๋ฅธ ์ฃผ์ ๋ธ๋ฆฌ์ง ์ฝ๋์ธ Py4J์ ํผ๋๋๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๊ทธ๋ค์ ์๋ฐ๋๋ ์ด์ ๊ณผ ๋จ์ ์ ๋ชจ๋ ๊ฐ์ง ์์ผ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ ์ํํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ก์ ํธ๊ฐ ๋ด ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ง ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๋๋ ์๋๋ก์ด๋๋ฅผ ์ง์ํ๋ ๋ฐ ํ์ํ ๊ฒ์ ๋ํ ์ฐ๊ตฌ๋ฅผ ํ์ง ์์์ต๋๋ค. ๋น๋ก ๋ด๊ฐ ๊ฐ๋ฅํ ๊ฒ๋ณด๋ค ์ฝ๊ฐ์ ๊ธฐ์ ์ฌ์์ด ์๋ค๋ฉด. ๋ค์ดํฐ๋ธ JNI์ Python์ C API์ ๋ํ ์ผ๋ฐ ์ด์ ํธ์ถ ์ธ์๋ ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์๋ ์์ ์ด ์์ต๋๋ค.
์ ๊ทผ ๋ฐฉ์์ ๊ดํ ํ JPype๋ "startJVM()" ๋ช ๋ น์ ์ฌ์ฉํ์ฌ JVM์ Python๊ณผ ๊ฒฐํฉํ๊ธฐ ์ํด ๋ ์ ์ ์ผ๋ก JNI๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ๋ฒ์ (2.0)๋ Java ๋ด์์ Python์ ์์ํ ์ ์๋ ๋ฐ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค. ๋ ์ด์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด ์ด ์์ ์ ์ํํฉ๋๋ค. ํ๋ก ํธ ์๋ ์ญํ ์ ํ๋ ๋ชจ๋ ๊ณ ๊ธ ํด๋์ค๋ฅผ ๋ณด์ ํ๋ Python ๊ณ์ธต, ์ง์ ์ ์ ๋ณด์ ํ๋ ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์๋ CPython ๊ฐ์ธ ๋ชจ๋, ๋ชจ๋ ์ ํ ๋ณํ ๋ฐ ์ผ์น๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ธฐ๋ณธ ๋ชจ๋๋ก ์๋ํ๋ C++ ์ง์ ๊ณ์ธต์ด ์์ต๋๋ค. Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ชจ๋ ์ ํธ๋ฆฌํฐ ์์ (๊ฐ์ฒด ์๋ช ์ ์ง, ์ฌ๋ผ์ด์ค ๋ฐ ์์ธ์ ๋ํ ์ง์ ํด๋์ค ์์ฑ, javadoc ์ถ์ถ๊ธฐ/๋ ๋๋ง)์ ์ํํ๋ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
8๋
์ JPype๋ ์ฝ๊ฐ ์๋ง์ด์์ต๋๋ค. Ruby์ Python์ ๋ชจ๋ ์ง์ํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ C++ ๋ ์ด์ด๋ ์์
ํ ๋ํผ๊ฐ ์ฝํ ์๊ณ ํ๋ฐํธ ์๋๋ ๋ชจ๋ Python์ผ๋ก ๋์ด ์์ด์ ๋งค์ฐ ๋๋ ธ์ต๋๋ค. ๋ํ numpy ์ง์์ด ์ปดํ์ผ๋์ด ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋ฐํ๋ ์ ์์ผ๋ฏ๋ก ๋ฐํ ์ ํ์์ ๋ถ๊ธฐ๋์์ต๋๋ค. ๋ค์ดํฐ๋ธ Python๊ณผ Java ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ํ๋ก์ ์ญํ ์ ํ๋ ค๋ฉด JException๊ณผ ๊ฐ์ ๋ง์ ์ด๋ํฐ ํด๋์ค๊ฐ ํ์ํ์ต๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ์ ํฉ๋ฅํ ์ง 3๋
๋ง์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. JPype์ ๋ ๊ฐ์ง ์ฃผ์ ๋ชฉํ(์ ๋ฅผ ์ํด)๋ ๋ฌผ๋ฆฌํ์๋ค์ด ํ๋ก๊ทธ๋๋ฐ์ ์ต์ํ์ฌ Java๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ๊ณผํ์ ์ธ Python ์ฝ๋์ ๋์ ์์ค์ ํตํฉ์ ๊ฐ์ง ์ ์์ ๋งํผ ์ถฉ๋ถํ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ ์๋ฐ๊ฐ ์ง์ํ๋ ๊ฐ์ฒด๊ฐ "๋ชจ๋ ์ฅ์" CPython ๊ฐ์ฒด ๋ํผ๋ฅผ ๊ฐ๋๋ก ํจ์ผ๋ก์จ ์ด๋ฅผ ์ํํฉ๋๋ค. Java ์์ ๋ฐฐ์ด์ ๋ณํํ๋ ๋์ Java ์์ ๋ฐฐ์ด์ numpy์ ๋์ผํ ์ง์
์ ์ ๋ชจ๋ ๊ตฌํํ๋ ์๋ก์ด ์์ Python ์ ํ์ผ๋ก ๋ง๋ค๊ณ ์ด ๋ชจ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ์ ์ก์ผ๋ก ์ง์๋ฉ๋๋ค. ๋ฐ๋ผ์ list(jarray)
๋๋ np.array(jarray)
๋ฅผ ํธ์ถํ์ฌ ๋น ๋ฅธ ๋ณํ์ด ๊ฐ๋ฅํฉ๋๋ค.
Android์ ์ ์ฉํ๋ ค๋ฉด ์์ ์ํ์ค๋ฅผ ๋ค์ ์์ ํด์ผ ํ๋ฉฐ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฝํฌ ์ฝ๋๋ฅผ ๋ณด๋ค ์ ํต์ ์ธ JNI ๋ชจ๋ธ๋ก ๊ต์ฒดํด์ผ ํฉ๋๋ค. ๋ค์ ๋ฒ์ ์์ ์ด๋ฏธ ์ฝํฌ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ผ๋ฏ๋ก ์ดํ ๋ฒ์ ์ ์ด๋ฏธ ์ถฉ์กฑ๋์์ต๋๋ค. ์ ์๋ง ํ์ํฉ๋๋ค.
๋ด๊ฐ ๋ณผ ์์๋ ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ์ฐจ์ด์ ์ PyJnius๊ฐ ๋ฐฐ์ด์ ์ค๊ฐ๋ ๋ฐฐ์ด์ ๋ณํํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ํฐ ๋ฐฐ์ด(์ข
์ข
๋ณํ๋์ง ์์)์ ๋ค๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์ ํธ๋๋ JPype ์คํ์ผ์ธ ๊ณผํ์ ์ฝ๋ฉ์ ๋งค์ฐ ๊ธ์ง๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋ณํ์ ์๊ตฌํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ๊ฐ์ ์ํ ์ ๋ฌ ๋ฐ ์ฐธ์กฐ์ ์ํ ์ ๋ฌ๊ณผ ๊ฐ์ ์ต์
์ด ๊ฐ์ ์ ์ฉ๋์ง๋ง, ์ด๋ ๋ค์ค ์ธ์ ํธ์ถ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ชจ๋ ์ธ์์ ๋ํด ํ๋์ ์ ์ฑ
์ ์ ํํ๋ ๊ฒ์ฒ๋ผ ์ ์ฌ์ ์ผ๋ก ๋ ํฐ ๋ฌธ์ ๋ก ์ด์ด์ง๋๋ค. ๋ํ ๋ค์ฐจ์ ๋ฐฐ์ด์ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ( obj.method(1, jnius.byref(list1), list2)
์ ๊ฐ์ด ์ฌ์ฉ๋๋ ์ด๋ํฐ ํด๋์ค๊ฐ ๋ฌ์ฑ๋ ์ ์๋ค๋ฉด ๋ ๋์ ์ ์ด๋ฅผ ์ ๊ณตํ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.) ์ด ์ธ์๋ GC ์ฐ๊ฒฐ, ํธ์ถ์์ ๋ฏผ๊ฐํ ๋ฉ์๋ ๋ฑ JPype๊ฐ ํด๊ฒฐํ ๋ฌธ์ ๊ฐ ๋ง์ต๋๋ค. ๋ค๋ฅธ ๊ฒ์ด ์๋ค๋ฉด JPype ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์ฌ์ฉํ ์ ์๋ ์ข์ ์์ด๋์ด๊ฐ ์๋์ง ํ์ธํ์ญ์์ค.
@Thrameos ์ต๊ทผ ๋ณํฉํ๋ ค๊ณ ํ๋ ๊ฒ์ Java Functional ์ธํฐํ์ด์ค์ Python ๋๋ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. https://github.com/kivy/pyjnius/pull/515 ์ฐธ์กฐ ; ๋๋ JPype์์ ๊ทธ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค?
JPype๋ 1.0.0๋ถํฐ ๊ธฐ๋ฅ ์ธํฐํ์ด์ค์ ๋๋ค๋ฅผ ์ง์ํฉ๋๋ค. ์ด๋ 3์ 30์ผ 1.0์ผ๋ก์ ํธ์ 30๊ฐ ์ค ์ผ๋ถ์์ต๋๋ค.
JPype๋ ์ค๋ ์ ๋ณต๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ 2004๋ ์ ์์๋์ด 2007๋ ๊น์ง ์คํ๋์์ต๋๋ค. ๊ทธ ํ ์ฌ์ฉ์ ๊ทธ๋ฃน์ด 2015๋ ๊ฒฝ Python 3์ผ๋ก ์ด์ํ๊ธฐ ์ํด ๋ถํ์์ผฐ๊ธฐ ๋๋ฌธ์ ํฐ ํ์ ์ป์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ 2017๋ ์ ๊ตญ๋ฆฝ ์ฐ๊ตฌ์์์ ์ฌ์ฉํ๊ธฐ ์ํด ์ ํ๋์ด 0.6์์ ์ฌ์ฉ๋์์ต๋๋ค. 3 ~ 0.7.2. ๊ทธ ๊ธฐ๊ฐ ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํต์ฌ ๊ธฐ์ ์ ๊ฐ์ ํ๊ณ ๊ฐํํ๋ ๋ฐ ๋ชจ๋ ๋ ธ๋ ฅ์ด ์ง์ค๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ฒ์งธ ํต์ฌ ์ฌ์์ฑ ํ 3์์ ๋ง์นจ๋ด ์๋ฃ๋์ด ๋ง์นจ๋ด 1.0.0์ ํธ์ํ ์ ์์์ต๋๋ค. ๊ทธ ์ดํ๋ก ์ฐ๋ฆฌ๋ "30์ผ ๋ฐค์ 30๊ฐ ๋ฝ๊ธฐ" ์์๋ฆฌ์คํธ ์บ ํ์ธ์์ "๋๋ฝ๋" ๋ชจ๋ ๊ฒ์ ์ถ๊ฐํด ์์ต๋๋ค. ๋๋ฌด ๋ง์ ์์ ์ผ๋ก ์ธํด ๊ตฌํํ ์ ์์๋ ๋ชจ๋ ๋ฐฑ๋ก๊ทธ๊ฐ ๋ง์นจ๋ด ํด๊ฒฐ๋์์ต๋๋ค(๋ฌธ์ ๊ฐ 50๊ฐ์์ 20๊ฐ๋ก ๊ฐ์ํ๊ณ ์ฌ์ฉ์์๊ฒ ๋ฌด์์ด ํ์ํ์ง ๋ฌป๋ ๋ฑ). ๋ฐ๋ผ์ ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์ด์ ๋ฒ์ ์์๋ ์ฐพ์ ์ ์์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ์์ ์ ์์ต๋๋ค. ์ ๋ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ ์์ฒญ์ 1์ฃผ์ผ๋ ์ฑ ์ ๋์ด ์ฒ๋ฆฌํ๊ณ ๋๋จธ์ง 3๊ฐ์ง(์ญ ๋ธ๋ฆฌ์ง, Python์ ํด๋์ค ํ์ฅ, ๋ ๋ฒ์งธ JVM์ ์์ํ๋ ๊ธฐ๋ฅ)๋ง ๋จ๊ฒ ๋์์ต๋๋ค.
Java๊ฐ Python์ ํธ์ถํ๊ณ Java ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ ์ ์๋๋ก Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์คํ ์ ์์ฑํ ์ ์๋๋ก ํ๋ ๋ฆฌ๋ฒ์ค ๋ธ๋ฆฌ์ง ์ฝ๋๋ฅผ ์๋ฃํ๊ธฐ ์ํ 6๊ฐ์์ ๊ธด ๋ ธ๋ ฅ ์ค 2๊ฐ์์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ๋ ๋ค์ ์ ์ด ๋ค ๊ฒ์ ๋๋ค. Python์ ๋ํ ๊ธฐ๋ณธ ์ง์์ ๋ฌ์ฑํ ์ ์๋๋ก ASM์ ์ฌ์ฉํ์ฌ ์ฆ์์์ Java ํด๋์ค๋ฅผ ๋น๋ํฉ๋๋ค. ์ฌ์ ํ Jython์ฒ๋ผ ์์ ํ ํตํฉ๋์ง๋ ์์์ง๋ง ํฐ ์ฐจ์ด๊ฐ ์์ ์ ๋๋ก ์ถฉ๋ถํ ๊ฐ๊น์ต๋๋ค.
์์ธํ ์ค๋ช ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ์๋ ์์ด๋์ด๊ฐ ์๋ค๋ฉด ์ฝ๋๋ฅผ ๊ณต๋ถํ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค. ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ์ฝ๋ ํ์ง๊ณผ ๊ตฌ์กฐ ๋ชจ๋์์ ๋ด๊ฐ ๋ณธ ๊ฒ์ด ๋งค์ฐ ๊นจ๋ํด ๋ณด์ ๋๋ค. ๋ชจ๋ ์์ ์ ์ถํํฉ๋๋ค. ๋น์ ์ Py4J์์ ํผํฉ์ ๋ํด ์ณ์์ต๋๋ค. ์ ์๊ฐ์ JPype๋ฅผ ๋ณด์์ ๋ ๋น์ ์ด ์ค๋ช ํ๋ ์ง์ ๋ถํ ์ํ์ ์์ด์ผ ํ๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด ์์ ์์ PyJNIus๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํ์ ๊ฒ์ ๋๋ค.
๊ฐ/๋ณํ์ ์ํ ์ ๋ฌ์ ๋ํ ๊ทํ์ ์์ ์ ๋งค์ฐ ์ฌ์ค์ด๋ฉฐ @hx2A ๊ฐ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์กฐ์ฌํ๊ณ ํ์ด์ฌ ์ ํ์ผ๋ก ๋ค์ ๋ณํ์ ์ ํ ์ฌํญ์ผ๋ก ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์๋ ์ต๊ทผ ํ ๋ก ์ ์ด๋ฐํ์ต๋๋ค. ์๋ฐ ๋ชฉ๋ก์ผ๋ก ๋ณํ๋๊ณ , ์๋ฐ์ ์ํด ์์ ๋๊ณ , ํ์ด์ฌ์ผ๋ก ๋ค์ ๋ณํ๋์ด ๊ฐ๋น์ง ์์ง์ ์ํด ํ์คํ ์ฐจ์ ์ฑ ์ด์์ต๋๋ค. ์ด์ ํค์๋ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๋น์ฉ์ผ๋ก ๋ ๋ฒ์งธ ๋ถ๋ถ์ ํผํ ์ ์์ต๋๋ค. ์๋ฐ๋ ๊ทธ๊ฒ๋ค์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ช ์ถฉ๋์ ์์ง๋ง ํ์คํ ๋ฌธ๋ฒ์ ์ผ๋ก ์ข ๋ ์๋๋ฝ์ต๋๋ค).
JPype์ PyJNIus์ ๊ฐ๋ฅํ ์ฐจ์ด์ ์ ๊ดํด์๋ Python ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Java ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์ด๋ฅผ Java์ ์ ๋ฌํ์ฌ ์ฝ๋ฐฑ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ Java ํด๋์ค๋ฅผ ํ์ฅํ๋ ค๋ฉด Java ๋ฐ์ดํธ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ํ์ด์ฌ์์, ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๋ค๋ฃฐ ์ ์๋ ์ผ๋ถ ์๋๋ก์ด๋ API๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ๊ทํ์ ์๊ฒฌ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ก ํ๋์ง ํ์คํ์ง ์์ง๋ง ์๋ง๋ Java ํด๋์ค๊ฐ ๊ทํ๋ฅผ ํธ์ถํ๋๋ก ํ ์ ์๋ ๋ฅ๋ ฅ์ด ์์ ์๋ ์์ต๋๋ค. ์ด์ ๊ฐ์ ํ์ด์ฌ ์ฝ๋(์ธํฐํ์ด์ค ์ฌ์ฉ).
JPype๋ Python์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์ผ๋ฐ Python ํด๋์ค์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
from java.util.function import Consumer
@jpype.JImplements(Consumer)
class MyConsumer:
@jpype.JOverride
def apply(self, obj):
pass
JVM์ด ์์๋๊ธฐ ์ ์ ํด๋์ค๊ฐ ์ ์๋ ๊ฒฝ์ฐ @JImplements ์์ ๋ฌธ์์ด์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ํ ๋ฒ์ ๊ตฌํํ ์ ์์ง๋ง ๋ชจ๋ ๋ฉ์๋๊ฐ ๊ตฌํ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ํ์ธํฉ๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ JPype๋ ์ค๋ฒ๋ก๋๋ ๋ฉ์๋๊ฐ ์๋ ๋์คํจ์น ๋ฉ์๋(๋ชจ๋ ์ค๋ฒ๋ก๋๋ ๋์ผํ ๋ฉ์๋๋ก ์ด๋)๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ Java์ Python ๋ชจ๋์์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ํ๋ ๊ธฐ๋ฅ์ธ ๊ฒฝ์ฐ ๊ฐ๋ณ ์ค๋ฒ๋ก๋๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ์๋ฌด๋ ์์ฒญํ์ง ์์์ต๋๋ค.
(ํธ์ง: ์ฐ๋ฆฌ๊ฐ Python ์์์ ์ฌ์ฉํ์ง ์์ ์ด์ ๋ ์ด๊ฒ์ด ์ถ๊ฐ๋์์ ๋ ๋ง์ ๋ฉํ ํด๋์ค ๋ฌธ์ ๋ฅผ ์ผ์ผํจ Python 2๋ฅผ ์ฌ์ ํ ์ง์ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํด๋์ค ํ์ฅ์ด ๋ฐฐ์น๋๋ฉด ๋ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฃผ์์ ์ ์ธ ์๊ฐ์ ํ ๋ฒ ํ๊ฐํ๋ ๊ฒ์ด ๋ ๊นจ๋ํ์ต๋๋ค.)
์ฐ๋ฆฌ๋ ๋์ผํ ์์คํ ์ ์ฌ์ฉํ์ฌ ํด๋์ค์ ๋ํ ์ปค์คํฐ๋ง์ด์ (dunder?)๋ฅผ ๊ตฌํํฉ๋๋ค.
@jpype.JImplementationFor("java.util.ArrayList")
class ArrayListImpl:
def __getitem__(self, i):
return self.get(i)
@jpype.JOverride
def addAll(self, list):
# Decide if we need to convert or can call directly.
...
๋ํ ์ฃผ์์ ์ฌ์ฉํ์ฌ "๋ชจ๋ Python ๊ฒฝ๋ก ๊ฐ์ฒด๊ฐ java.io.File๋ก ๋ณํ๋จ"๊ณผ ๊ฐ์ ์์์ ๋ณํ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค.
@jpype.JConversion("java.io.File", instanceof=pathlib.PurePath)
def _JFileConvert(jcls, obj):
Paths = jpype.JClass("java.nio.file.Paths")
return Paths.get(str(obj))
๋ถ๋ช ํ ์ด๋ฌํ ์ข ๋ฅ์ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํน์ C ๋ฐฉ๋ฒ๋ณด๋ค ์ฝ๊ฐ ๋๋ฆฌ์ง๋ง ๊ฐ๋ ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋๊ฒ ์ ์งํฉ๋๋ค. ์ ๋ ๋ณ๋ชฉ ํ์์ด ์ ์ฆ๋ ์ค์ํ ๊ฒฝ๋ก๋ฅผ ํ์์ ๋ฐ๋ผ C๋ก ๋๋๋ ค ๋์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ํ ๊น๋ํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ตฌ๋ฌธ ์คํ์ ์ ๊ณตํฉ๋๋ค. MyJavaClass@obj
=> MyJavaClass๋ก ์บ์คํธ(Java์ ์์ํ๋ (MyJavaClass)obj
) ๋๋ cls=JInt[:]
=> ๋ฐฐ์ด ์ ํ ์์ฑ( cls=int[].class
) ๋๋ a=JDouble[10][5]
=> multidim ๋ฐฐ์ด์ ๋ง๋ญ๋๋ค( double[][] a = new double[10][5]
).
์ ๋ JPype์์ ํด๋์ค๋ฅผ ํ์ฅํ๊ธฐ ์ํ ํ๋กํ ํ์ ์์ ์ ํด์์ต๋๋ค. ์ผ๋ถ Swing ํด๋์ค ๋ฐ ๊ธฐํ API์์ ํด๋์ค ํ์ฅ์ด ํ์ํ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ง๊ธ๊น์ง ๋ด๊ฐ ๋ง๋ ์๋ฃจ์ ์ ์ฌ์ ์๋ ๊ฐ ๋ฉ์๋์ ๋ํด HashMap์ด ์๋ ํ์ฅ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ํด๋น ์ง์ ์ ์ ๋ํ ํด์๋งต์ ์๋ฌด ๊ฒ๋ ์์ผ๋ฉด ์ด๋ฅผ super์ ์ ๋ฌํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋ก์ ๋ฉ์๋ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ด ์ญ ๋ธ๋ฆฌ์ง๊ฐ ์๋ฃ๋ ํ์ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์ฌ Java๊ฐ ์ค์ ๋ก Java ํ๋ก์ ๋ฉ์๋๋ฅผ ๊ฑฐ์น์ง ์๊ณ Python ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. ๊ทธ๋์ ํ๋กํ ํ์ ์ด ์๋ํ๊ธฐ๊น์ง ์ฝ 6๊ฐ์์ด ๋จ์์ต๋๋ค. epypj ๋ถ๊ธฐ(์ญ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ๋ด ์ด๋ฆ)๋ฅผ ๋ณด๋ฉด Java์์ Python์ผ๋ก ๋ค์ ํธ์ถ์ด ์๋ํ๋ ๋ฐฉ์๊ณผ ASM์ ์ฌ์ฉํ์ฌ ์ฆ์์์ Java ํด๋์ค๋ฅผ ๋ง๋๋ ํธ์ถ์๋ฅผ ์์ฑํ๋ ํจํด์ ๋ณผ ์ ์์ต๋๋ค.
๊ฐ๋น์ง ์์ง์ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ํด๋น ์์ ์ ์ํํ๋ JPype๋ ๊ฑฐ์ ์์ต๋๋ค. ๋จผ์ Python ๊ฐ์ฒด์ ์๋ช ์ Java ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉํ๋ JPypeReferenceQueue(native/java/org/jpype/ref/JPypeReferenceQueue)๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ Java๊ฐ ์ผ์ ๊ธฐ๊ฐ ๋์ Python ๊ฐ๋ ์ ์ก์ธ์คํด์ผ ํ๋ ๋ฒํผ ๋ฐ ๊ธฐํ ํญ๋ชฉ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ ๋ฒ์งธ๋ ์ ์ญ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ Python์ด ๋ฒ์ ๋ด์์ Java ๊ฐ์ฒด๋ฅผ ๋ณด์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด์๋ ํน์ ์กฐ๊ฑด(ํ ํฌ๊ธฐ, ์๋์ ์ฆ๊ฐ)์ด ์์ ๋ ์์คํ ์ค ํ๋๊ฐ GC๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ ์ด๋ฅผ ๋ค๋ฅธ ์์คํ ์ pingํ๋ ๊ฐ๋น์ง ์์ง๊ธฐ ๋งํฌ(native/common/jp_gc.cpp)๊ฐ ํ์ํฉ๋๋ค. ๋ง์ง๋ง ํ๋ก์๋ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฃจํ๋ฅผ ํ์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(ํ๋ก์๋ Java ์ ๋ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๊ณ Java ์ ๋ฐ์ Python ๊ตฌํ์ ๋ค์ ๊ฐ๋ฆฌํด). ๊ฒฐ๊ตญ ์ ๋ Python์ด Java๋ฅผ ํธ๋๋ฒ์คํ ์ ์๋๋ก ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง ์ด๋ ๊ณง ๊ฐ ๊ธธ์ ๋๋ค.
์ ๋ ์๋๋ก์ด๋๊ฐ ์๋ ๋ฐ์คํฌํ์์ pyjnius๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค ์ค ํ ๋ช ์ ๋๋ค. ํ๋ก์ ํธ ๊ตฌ์ถ์ ์์ํ ๋ JPype์ ๋ํด ๋ชฐ๋์ง๋ง ์ฐจ์ด์ ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ ์ํด ์กฐ์ฌ๋ฅผ ํ์ต๋๋ค.
pyjnius์ ๊ณ ์ ํ ๊ธฐ๋ฅ ์ค ํ๋๋ ํธ์ถ์๊ฐ ๋ณดํธ ๋ฐ ๋น๊ณต๊ฐ ๋ฉ์๋์ ํ๋๋ฅผ ํฌํจํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ด ์ ํธ ์ฌํญ์ ๊ณต๊ฐ ์ ์ฉ์ด์ง๋ง ๋น๊ณต๊ฐ ํ๋์ ๋ฉ์๋๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ ์ฉํ๋ค๋ ์ฃผ์ฅ์ ์ดํดํฉ๋๋ค.
์ฑ๋ฅ์ ๋ด ํ๋ก์ ํธ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋ ํด๋์ค๋ก ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์ํํ์ต๋๋ค.
package org.pkg;
public class MyClass {
public MyClass() {
}
public int number = 42;
public float add1(float x, float y) {
return x + y;
}
public float add2(float x, float y) {
return x + y;
}
public float add2(int x, int y) {
return x + y;
}
}
JPype์์:
In [1]: import jpype
...: import jpype.imports
...: jpype.startJVM()
...: from org.pkg import MyClass
...: myInstance = MyClass()
...:
In [2]: %timeit myInstance.number
640 ns ยฑ 2.65 ns per loop (mean ยฑ std. dev. of 7 runs, 1000000 loops each)
In [3]: %timeit myInstance.add1(10.3, 20.5)
2.13 ยตs ยฑ 24.8 ns per loop (mean ยฑ std. dev. of 7 runs, 100000 loops each)
In [4]: %timeit myInstance.add2(10.3, 20.5)
2.19 ยตs ยฑ 9.41 ns per loop (mean ยฑ std. dev. of 7 runs, 100000 loops each)
ํผ๋์ฐ์ค์์:
In [1]: import jnius
In [2]: MyClass = jnius.autoclass('org.pkg.MyClass')
In [3]: myInstance = MyClass()
In [4]: %timeit myInstance.number
161 ns ยฑ 0.104 ns per loop (mean ยฑ std. dev. of 7 runs, 10000000 loops each)
In [5]: %timeit myInstance.add1(10.3, 20.5)
1.04 ยตs ยฑ 8.16 ns per loop (mean ยฑ std. dev. of 7 runs, 1000000 loops each)
In [6]: %timeit myInstance.add2(10.3, 20.5)
2.71 ยตs ยฑ 11.2 ns per loop (mean ยฑ std. dev. of 7 runs, 100000 loops each)
Pyjnius๋ ์ค๋ฒ๋ก๋๋ ๋ฐฉ๋ฒ์ ์ ์ธํ๊ณ ๋ ์๋นํ ๋น ๋ฆ ๋๋ค. ๋ฉ์๋๊ฐ ์ค๋ฒ๋ก๋๋ ๋ ํธ์ถํ ๋ฉ์๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ฐธ๊ณ ์ฌํญ์ ๋น๊ตํด์ผ ํฉ๋๋ค. Pyjnius์๋ ๋ง์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ ์ด๋ฌํ ์ ์ ๋งค๊ธฐ๊ธฐ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. JPype๋ ๊ทธ ๊ฒฐ์ ์ ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ญ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฒค์น๋งํฌ ๋ชฉ์ ์ผ๋ก:
In [9]: def add(x, y):
...: return x + y
...:
In [10]: %timeit add(10.3, 20.5)
82.9 ns ยฑ 0.187 ns per loop (mean ยฑ std. dev. of 7 runs, 10000000 loops each)
๋ฌผ๋ก ๋ช ยตs์ ์ฐจ์ด๋ ์ฌ์ํ์ง๋ง ์์ฒ ๊ฐ์ ์์ ํธ์ถ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ํํ๋ ๊ฒฝ์ฐ์๋ ๋ํด์ง๋ฏ๋ก ์ํํด์ผ ํฉ๋๋ค.
JPype์ numpy์ ํตํฉ์ ๋งค์ฐ ํ๋ฅญํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค. ์ฐ๊ตฌ์๋ค์ด ๋ณต์กํ ๊ตฌ๋ฌธ ์์ด Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฐ ๋ฐฐ์ด์ ์ ๋ฌํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ด๊ฒ์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์ ์ ์์ต๋๋ค. ๋ํ ํฐ ๋ฐฐ์ด์ ์ ๋ฌํด์ผ ํ๊ณ tobytes()
๋ฐ ๋ฐ์ดํธ๋ฅผ ์์ ํ ์ ์๋ ํน์ Java ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํ์ง๋ง ๋ถ๋ช
ํ ๊ทธ๋ ๊ฒ ๊น๋ํ๊ฑฐ๋ ํธ๋ฆฌํ์ง๋ ์์ต๋๋ค.
๋ถํํ๋ JPype ์๋๋ ์ผ์ข ์ ์ ๋ง์ ๋๋ค. JPype๋ ๋์ ์ผ๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํด ๋งค์ฐ ๋ฐฉ์ด์ ์ ๋๋ค. ์ด๋ ์ฌ์ํ์ง ์์ ์ค๋ฒํค๋๊ฐ ๋ง๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์๋ฅผ ๋ค์ด Java ํธ์ถ์ด ์ํ๋ ๋๋ง๋ค ์ค๋ ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๋ฏ๋ก IDE์ ๊ฐ์ ์ธ๋ถ ์ค๋ ๋์์ ํธ์ถ๋๋ ๊ฒฝ์ฐ segfault๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ด ๋ก์ปฌ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ชจ๋ ๊ณผํ์์ด๋ฏ๋ก ์ง์ ์ ์ ๋ชจ๋ ๋งค์ฐ ๋์ฐํ ๊ต์ฐจ ๋ฐฐ์ ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฉ๋๋ค. ์ด๋ค ๊ฒ์ด ๊ทธ๋ค์๊ฒ ์ธ๊ทธํดํธ(segfaults)๊ฐ ์๋ค๋ฉด(์๋ฌด๋ฆฌ ๋ฏธ์ณค์ด๋), ๋๋ ์คํจํ์ต๋๋ค. (์ด๋ ์๋์ ์ผ๋ก ๋์ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ํฌํจํ์ฌ 1500๋ฒ์ ํ ์คํธ๋ฅผ ์ค๋ช ํ ๊ฒ์ ๋๋ค.)
๋์งธ, ๊ฐ๋ณ ์์ ์ ์๋๋ ์ํ๋๋ ์์ ์ ์์ฃผ ์์ ์ฐจ์ด์์ ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋น์ ์ด ์ค ์ฌ์ํ ์๋ ์ต์ ์ ๊ฒฝ์ฐ ์ค ํ๋์์ต๋๋ค. ์ก์ธ์ค ์ค์ธ ํ๋ ์ ํ์ ๋ฐ๋ผ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ก์ธ์ค ์๋๊ฐ ์ค์ ๋ก ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
์๋ ์์ ์ ๊ฒฝ์ฐ int ํ๋๋ฅผ ์์ฒญํ๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์ ํ๋์ ์ก์ธ์คํ ๋ ์๋ ๋ฒค์น๋งํน์ ์ํํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ฌ์ํ ์ผ์ด๋ผ๋ ์ค์ ๋ก๋ ๊ทธ๋ ๊ฒ ์ฌ์ํ์ง ์์ต๋๋ค.
์ฐจ์ด์ ์ ํ๋๋ Python long์ ๋ฐํํ๊ณ ๋ค๋ฅธ ํ๋๋ ์ค์ Java ์ ์(Java ๋ณํ ๊ท์น์ ๋ฐ๋ฆ)๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ค๋ฒ๋ก๋๋ ๋ฉ์๋์ ์ ๋ฌ๋๊ณ ์ ๋๋ก ๋ฐ์ธ๋ฉ๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ํผ ์ ํ์ ๋ฐํํ๋ ์์
์ ๋จ์ํ Python ์ ํ์ ๋ฐํํ๋ ๊ฒ ์ด์์ด๋ฏ๋ก ์๋์์ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ช ๊ฐ์ง ๋ค๋ฅธ ํ๋ ์ ํ์ ํ ์คํธํ์ฌ ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ค๊ณ ํ์ต๋๋ค. ๋ถํํ๋, ๋ด๊ฐ Object ํ๋๋ฅผ ํ ์คํธํ์ ๋ jnius๋ "harness.objectField = ๋ง๊ตฌ" ์ฝ๋์์ segfault๋ฅผ ๋ฐ์์์ผฐ์ต๋๋ค. ๊ทธ ํน์ ๊ต์ฐจ ๋ฐฐ์ ์ด ์ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋์๊ฒ๋ ์คํจํ์ต๋๋ค. ๋๋ ํธ์ถ ์๋๊ฐ 3-5๋ฐฐ, ํน์ ์ด๋ ์ด ์ก์ธ์ค๊ฐ 300๋ฐฐ ๋นจ๋ผ์ง ์ฌ๊ฐํ ์๋ฐ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ ์ธ์ JPype์ ์๋์ ๊ทธ๋ค์ง ๊ด์ฌ์ด ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ์ด๋ค ๋ถ๋ถ์ด ๊ฐ์ ๋ ์ ์๋์ง ๊ฒํ ํ๊ณ ํ์ธํด์ผ ํ ๊ฒ์ ๋๋ค. ๋๋ ์์ ์ ์ ๊ฑฐํ๊ฑฐ๋ ๋ฐํ ๊ณ์ฝ์ ์ ๊ฑฐํ์ง ์๊ณ PyJnius์ ๊ฐ์ ๋งจ ๋ผ๋ก ์ค์ผ ์ ์๋์ง ์์ฌํฉ๋๋ค(๋๋ ํ ์ ์์). ๊ธฐ๊ปํด์ผ 10-30%์ ์๋ ํฅ์์ด ์ฌ์ ํ ๊ฐ๋ฅํฉ๋๋ค.
private ๋ฐ protected ํ๋์ ์ก์ธ์คํ๋ ๊ธฐ๋ฅ์ ํ์คํ ๊ฐ๋ฅํฉ๋๋ค. ๋๋ ์ฌ์ฉ์๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ ๋
ธ์ถํ๋ ๊ฒ๋ณด๋ค ๋ฐ์ฌ ๋๋ ๊ธฐํ ๋ด๋ถ ์ก์ธ์ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊ทธ๋ฐ ๊ฒ์ ์ ๊ณตํด์ผ ํ๋ค๋ฉด ๊ณต๊ฐ์ ์ผ๋ก ๋
ธ์ถ๋์ง ์๋ ํ๋๋ฅผ ํฌํจํ๋ _private
๋ผ๋ ํ๋๋ฅผ ๋ง๋ค ๊ฒ์
๋๋ค. JPype๋ ๊ฐ ์ ํ์ ๋ํด ํ๋์ ํด๋์ค ๋ํผ๋ง ์ ๊ณตํ๋ฏ๋ก ์ธ๋ฐํ ์ ์ด ๋ฐฉ๋ฒ์ด ๋ณ๋ก ์์ต๋๋ค. ๋ฐ๋ผ์ ๋น๊ณต๊ฐ ์ก์ธ์ค ๊ถํ์ด ์๋ ํด๋์ค๋ฅผ ๋ง๋ ๋ค์ ๋์ผํ ์ ํ์ ๋ ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๋น๊ณต๊ฐ๊ฐ ๋
ธ์ถ๋์ง ์๋๋ก ์ ํํ ์ ์์ต๋๋ค. ๋๋ ๋ฌธ์์ด ๋ณํ์ผ๋ก ๊ทธ ๊ธธ์ ๊ฐ๊ณ ์ด๋ค ๋์๊ด์ ํ๋์ ์ ์ฑ
์ ์ ํํ๊ณ ๋ค๋ฅธ ๋์๊ด์ ๋ค๋ฅธ ์ ์ฑ
์ ์ ํํ์ฌ ๋นํธํ์ฑ์ ์ด๋ํ๋ ์ฌ์์ด์์ต๋๋ค.
๋ฐฐ์ด ๋ชฉ๋ก์ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์คํํ์ต๋๋ค.
import jpype
import timeit
jpype.startJVM()
ArrayList = jpype.JClass("java.util.ArrayList")
def pack():
ja = ArrayList()
for i in range(1000):
ja.add(i)
def iter(ja):
u = 0
for i in ja:
u+=i
def access(ja):
u = 0
for i in range(len(ja)):
u+=ja.get(i)
def access2(ja):
u = 0
for i in range(len(ja)):
u+=ja[i]
ja = ArrayList()
for i in range(1000):
ja.add(i)
print("Pack arraylist %e"%( timeit.timeit("pack()", globals=globals(), number=1000)/1e6))
print("Iterate arraylist %e"%(timeit.timeit("iter(ja)", globals=globals(), number=1000)/1e6))
# Get is a direct call
print("Access(get) arraylist %e"%(timeit.timeit("access(ja)", globals=globals(), number=1000)/1e6))
# [] is emulated
print("Access([]) arraylist %e"%(timeit.timeit("access2(ja)", globals=globals(), number=1000)/1e6))
ํฉ ๋ฐฐ์ด ๋ชฉ๋ก 2.768904e-06
๋ฐฐ์ด ๋ชฉ๋ก 5.208071e-06 ๋ฐ๋ณต
์ก์ธ์ค(๊ฐ์ ธ์ค๊ธฐ) ๋ฐฐ์ด ๋ชฉ๋ก 4.037985e-06
์ก์ธ์ค([]) ๋ฐฐ์ด ๋ชฉ๋ก 4.690264e-06
ํฉ ๋ฐฐ์ด ๋ชฉ๋ก 3.322248e-06
๋ฐฐ์ด ๋ชฉ๋ก 4.099314e-06 ๋ฐ๋ณต
์ก์ธ์ค(๊ฐ์ ธ์ค๊ธฐ) ๋ฐฐ์ด ๋ชฉ๋ก 5.653444e-06
์ก์ธ์ค([]) ๋ฐฐ์ด ๋ชฉ๋ก 7.762727e-06
๋งค์ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์ฌ์ํ๊ฒ ๋ค๋ฅผ ์ ์๋ค๋ ๊ฒ ์ธ์๋ ๋งค์ฐ ์ผ๊ด๋ ์ด์ผ๊ธฐ๊ฐ ์๋๋๋ค. ๋น์ ์ด ํ๋ ๋ชจ๋ ๊ฒ์ด ๋ฉ์๋์ ์ ๊ทผํ๋ ๊ฒ์ด๋ผ๋ฉด ๊ทธ๊ฒ๋ค์ ๊ฝค ๋น์ทํ ๊ฒ์ ๋๋ค. JPype๋ก ์ฌ์ ๋ณํ๋ ๋ฐฐ์ด์ ์ ๋ฌํ๋ ๊ฒ์ 100๋ฐฐ ๋ ๋น ๋ฅด๋ฉฐ ๋ชฉ๋ก๊ณผ ํํ์ ๋ณํํ๋ JPype๋ 2๋ฐฐ ๋ ๋๋ฆฝ๋๋ค(ํ์ฌ ๋ฒกํฐ ์ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ํํ์ ๋ํ ํน์ ์ฐํ๊ฐ ์์). ๋ฐ๋ผ์ ๊ฒฐ๋ก ์ ์ฝ๋ฉ ์คํ์ผ์ ๋ฐ๋ผ ์ด๋ ์ชฝ์ด ํจ์ฌ ๋น ๋ฅผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ด ์ฌ์ฉ์๋ ์ผ๋ฐ์ ์ผ๋ก ์๋๋ณด๋ค๋ ์ฌ์ฉ ํธ์์ฑ๊ณผ ๋ฐฉํ ๊ตฌ์ฑ์ ์ํด JPype๋ฅผ ์ ํํฉ๋๋ค. (์ ๋๋ด์ด์ผ! JPype๊ฐ ์ฐ์ฐํ Google์์ ์ฐพ์ ์ฒซ ๋ฒ์งธ ๋งํฌ์ด๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท์์ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.)
JPype๊ฐ ๋ฉ์๋ ๋ฐ์ธ๋ฉ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ๊ฐ๋ฐ์/์ฌ์ฉ์ ๊ฐ์ด๋์ ์ธ๋ถ์ฌํญ์ด ์์ด์ผ ํฉ๋๋ค. ๋ฉ์๋ ๋ฐ์ธ๋ฉ์ Java ์ฌ์์ ์ ๊ณต๋ ๊ท์น์ ๋ฐ๋ผ ๋์คํจ์น์ ๋ํ ๋ฉ์๋ ๋ชฉ๋ก์ ์ฌ์ ์ ๋ ฌํ์ฌ ์์ํ์ฌ ๋ฌด์ธ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฒ์ ์จ๊ธฐ๋ฉด ๋ชฉ๋ก์์ ๋จผ์ ํ์๋๋๋ก ํฉ๋๋ค(์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด native/java/org/jpype์์ ์ฐพ์ ์ ์์ต๋๋ค. ๋์คํจ์น๊ฐ ์ฒ์ ์์ฑ๋ ๋ ์ ๋ ฌ์ ์ํํ๊ธฐ ์ํด Java ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์ฌ์ฉ). ๋ํ ๊ฐ ๋ฐฉ๋ฒ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์จ๊ธฐ๋ ๊ธฐ๋ณธ ์ค์ ๋ชฉ๋ก์ด ์ ๊ณต๋ฉ๋๋ค. ํด๊ฒฐ์ ๋จผ์ ๊ฐ ์ธ์๋ฅผ ํ์ธํ์ฌ ์ธ์์ ๋ํ "Java ์ฌ๋กฏ"์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. Java ์ฌ๋กฏ์ ๋ณํ์ด ํ์ ์๋ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ์ผ์นํ๊ธฐ ์ ์ ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ฉด ์์์ ๊ท์น์ด ์๋ ์ง์ ๊ท์น์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ์ ๋ฐ๋ผ ์ธ์๋ฅผ 4๋จ๊ณ(์ ํ, ์์์ , ๋ช ์์ , ์์)๋ก ์ผ์น์ํต๋๋ค. ๋ค์ ๋ฉ์๋๋ก ๊ฑด๋๋ฐ๊ธฐ ์ํด ๋ช ์์ ๋ฐ ์์์ ๋ํ ๋ฐ๋ก ๊ฐ๊ธฐ์ ๋๋ค. ์ ํํ ์ ๋ณด๋ฅผ ์ป์ผ๋ฉด ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ๋จ์ถํ์ฌ ํธ์ถ๋ก ์ด๋ํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐ์ธ๋ฉ์ด ์๋ ๋ฉ์๋๋ฅผ ์จ๊น๋๋ค. ์จ๊ฒจ์ง์ง ์์ ๋ ๊ฐ์ ์์์ ์ผ์น ํญ๋ชฉ์ด ๋ฐ๊ฒฌ๋๋ฉด TypeError๊ฐ ์งํ๋ฉ๋๋ค. ๋ชจ๋ ์ผ์น ํญ๋ชฉ์ด ์์ง๋๋ฉด ๋ณํ ๋ฃจํด์ด ์คํ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Python ์ ์ญ ์ ๊ธ์ ํด์ ํ๊ณ ํธ์ถํ๊ณ ์ ์ญ ์ ๊ธ์ ๋ค์ ํ๋ํฉ๋๋ค. ๋ฐํ ์ ํ์ด ์กฐํ๋๊ณ ๋ฐํ๋ ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์ Python ๋ํผ๊ฐ ์์ฑ๋ฉ๋๋ค(๊ณต๋ณ ๋ฐํ์ ์ฌ์ฉํ๋ฏ๋ก ๋ฐํ๋ ์ ํ์ด ๋ฉ์๋์ ์ ํ์ด ์๋๋ผ ๊ฐ์ฅ ๋ง์ด ํ์๋จ). ๊ฐ๋ณ ์ธ์์ ๋ํ ์ฝ๊ฐ์ ๋ณต์ก์ฑ์ด ์์ง๋ง ์ฌ์ ๊ตฌ์ฑ๋ ํ ์ด๋ธ์ foo(double, double)๋ฅผ ์๋ํ๊ธฐ ์ ์ foo(long, long)๋ฅผ ์๋ํ๊ณ (long , long)์ Java ๋ฉ์๋ ํ์ธ ๊ท์น์ผ๋ก ์ธํด ๋ชจ๋ ์ผ์น ํญ๋ชฉ์์ double, double์ ๋ฐฉ์งํฉ๋๋ค. ๋ด๊ฐ ๊ตฌํํ ์ ์๋ ๋ช ๊ฐ์ง ์๋ ํฅ์์ด ์์ง๋ง ์ถ๊ฐ ์บ์ฑ ํ ์ด๋ธ์ด ํ์ํฉ๋๋ค.
2017๋ ์ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ์๋ ์ฃผ๋ฌธ ์์คํ ์ ์์๋ฐ์์ต๋๋ค. ์ค๋ฒํค๋์ ๋๋ถ๋ถ์ ๋ฐ์ด๋ด๊ธฐ ์ํด ์บ์์ ์๋ฐ ์ฌ๋กฏ์ ์จ๊ธฐ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋ฉ์๋์ ์คํ ๊ฒฝ๋ก๋ฅผ ์ต์ ํํ์ต๋๋ค. JPype์ ์์ ๋ ์ซ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํฉ ๋ฐฐ์ด ๋ชฉ๋ก 2.226081e-06
๋ฐฐ์ด ๋ชฉ๋ก 4.082152e-06 ๋ฐ๋ณต
์ก์ธ์ค(๊ฐ์ ธ์ค๊ธฐ) ๋ฐฐ์ด ๋ชฉ๋ก 2.962606e-06
์ก์ธ์ค([]) ๋ฐฐ์ด ๋ชฉ๋ก 3.644642e-06
๋ด ๋ก์ปฌ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ชจ๋ ๊ณผํ์์ด๋ฏ๋ก ์ง์ ์ ์ ๋ชจ๋ ๋งค์ฐ ๋์ฐํ ๊ต์ฐจ ๋ฐฐ์ ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฉ๋๋ค. ์ด๋ค ๊ฒ์ด ๊ทธ๋ค์๊ฒ ์ธ๊ทธํดํธ(segfaults)๊ฐ ์๋ค๋ฉด(์๋ฌด๋ฆฌ ๋ฏธ์ณค์ด๋), ๋๋ ์คํจํ์ต๋๋ค.
์, segfaults๋ ๋์ฐํ๋ฉฐ pyjnius๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ์ ๋ ์๋ฐฑ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋ ์๋ง๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ด ์ฝ๋์ ๋ด์ฅํ๊ธฐ ๋๋ฌธ์ ์ค๋ซ๋์ ์๋ฌด ๊ฒ๋ ์ป์ง ๋ชปํ์ต๋๋ค. ์ด์ ๋ชจ๋ ๊ฒ์ด ์์ ์ ์ผ๋ก ์๋ํฉ๋๋ค. ๋๋ ๋น์ ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํดํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค์ํ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ์ดํฐ ๋ถ์์ ์ํํ๊ธฐ ์ํด Java ๊ฐ์ฒด๋ก ์ง์ ์์ ํ๋ ๊ณผํ์์ธ ๊ฒฝ์ฐ segfault๋ก ์ธํด ๋ชจ๋ ์์ ์ด ์์ค๋ฉ๋๋ค. JPype๋ ์ต์ข ์ฌ์ฉ์๊ฐ Python์ ํตํด Java ๊ฐ์ฒด๋ก ์ง์ ์์ ํ๋ ๊ณผํ ์์ ์ ์ํํ๋ ๋ฐ ๋ ์ ํฉํด ๋ณด์ ๋๋ค. pyjnius์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ Android์ ํต์ ํ๋ ๊ฒ๊ณผ ๋ค๋ฆ ๋๋ค. ์ด ๊ฒฝ์ฐ ์์ ๋ฌธ์ ๋ ๊ฐ๋ฐ์์ ๋ฌธ์ ์ด๋ฏ๋ก ์์ ๋ ์๋์ ๋ํด ๋ค๋ฅธ ์ ํ์ ํ๋ ๊ฒ์ด ์ ์ ํ ์ ์์ต๋๋ค.
๋๋ "๋น์ ์ด ์ด ์์๋๋ก ์ด ์ฌ๊ฐํ์ ๋ฐ๋ ํ ์์ ํฉ๋๋ค"์ ์ด๋ ฌํ ํฌ์ด ์๋์ ์ธ์ ํฉ๋๋ค. JPype ์์ ์ ์์ํ์ ๋ ๋ก์ปฌ ๊ทธ๋ฃน์ ์ฝ๋๋ฅผ ์ ๋ฌํ ์ ์์ ๋งํผ ๋ชจ๋ ์ง์ ์ ์ ๋ฐฉํ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑฐ์ 1๋ ์ด ๊ฑธ๋ ธ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ดํ๋ก 2๋ ์ API ์๋จธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. JVM์ด ๋ก๋๋์ง ์๋(ํด๊ฒฐํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ด) ์์์ ๋๋ฌธ ์ฌ๋๋ค์ ์ ์ธํ๊ณ ๋ JPype๊ฐ ํ๋ก๋์ ์ฝ๋ ํ์ค์ผ๋ก ์ฌ๋ผ์๊ธฐ ๋๋ฌธ์ ๋จ์ ์๋ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์์ต๋๋ค.
์๋์ ์์ ์ ์ ์ถฉ์ ๊ดํด์๋ ์๋๋ ํ๋ฅญํ์ง๋ง ์์ ํ ์์ ์ ์ํํ ํ์ฌ ์๋๋ฅผ ์ป๊ณ ์๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋๋ถ๋ถ์ ์ฌ์ฉ์์๊ฒ ์ข์ง ์์ ๊ฑฐ๋์ ๋๋ค. ํ๋กํ ํ์ดํ ์ฝ๋๋ฅผ ๋๋ฆฌ๋ ํ๋ก๋์ ์์คํ ์ ์์ฑํ๋ ์์ ์ ์ค๋จํ๊ณ segfault๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๋ํด์ผ ํ๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ ์ง๋ฉดํด์๋ ์ ๋๋ ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ํ๋ ์ผ์ ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ Android ์๋ฎฌ๋ ์ดํฐ์์ JPype๋ฅผ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ์๋ฅผ ๊ธฐ๊บผ์ด ์ ๊ณตํ๋ค๋ฉด ํ์ํ ์์ ์์ ์ ๋ํด ์ ์ ์์ต๋๋ค.
Android์์ ์ฌ์ฉํ๋ ค๋ฉด pyjnius๋ฅผ python-for-android์ ์ํด ๋น๋๋ Python ๋ฐฐํฌํ์ ์์ ๋ก ํจํค์งํ๊ณ (์ข ์ข buildozer๋ฅผ ๋ ์ฌ์ด ์ธํฐํ์ด์ค๋ก ์ฌ์ฉํ์ง๋ง ๋์ผํจ) ์ด ๋ฐฐํฌํ์ ์ ๊ณตํ๋ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด python ์ฝ๋๋ pyjnius ๋๋ ์ฌ์ฉ์๊ฐ ์ฑ์ ์คํํ ๋ python ๋ฐฐํฌํ์ ๋น๋๋ ๋ค๋ฅธ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ๋ฐฐํฌํ์์ jpype๋ฅผ ์ปดํ์ผํ๋ ๊ฒ์
๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์๊ตฌ ์ฌํญ์ ์ผ๋ถ๋ผ๊ณ ๋งํ ๋ p4a(https://github.com/kivy/python-for-android/)์ ์ํด ์ํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋) "๋ ์ํผ"๋ p4a์ ์์ ํ์ด์ฌ์ด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ๋ฐ ํ์ํฉ๋๋ค. pyjnius์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ https://github.com/kivy/python-for-android/blob/ ์์ ์ฐพ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด p4a.local_recipes
์ ์ค์ buildozer.spec
๋น์ ์ด ํฌํฌ์ ํ์ด์ฌ๋ฅผ ์ํด ์๋๋ก์ด๋๋ฅผ ํ์๊ฐ ์์ต๋๋ค, ์๊ตฌ ์ฌํญ์ ๋ํ ์กฐ๋ฆฌ๋ฒ์ ์ฐพ์ ์์๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ธ ๋น์ ์ ์กฐ๋ฆฌ๋ฒ์ ์ฌ์ฉํ์ญ์์ค.
https://buildozer.readthedocs.io/en/latest/installation.html#targeting -android ๋ ๋ง์ ์์ ์ ์๋ํํ๊ณ ์ฌ์ ํ ๋ก์ปฌ ๋ ์ํผ๋ฅผ ์ค์ ํ์ฌ ์๋ํ ์ ์์ผ๋ฏ๋ก buildozer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋น๋๋ python๊ณผ arm์ ๋ํ ์ฌ๋ฌ ์ข ์์ฑ์ ๋น๋ํด์ผ ํ๋ฏ๋ก ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ์ด๋ฅผ ์ํ Android ndk ๋ฐ sdk๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค. ์ฑ์ ๊ธฐ๋ณธ kivy ๋ถํธ์คํธ๋ฉ์ ์ฌ์ฉํ๊ณ jpype๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ ์ด๋ธ์ ์ผ๋ถ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๊ฑฐ๋ ์ฌ์ง์ด ์ธ์๋ฅผ ์ฌ์ฉํ๋ logcat์ ํ์ํ๋ ์ฑ๊ณผ ๊ฐ์ "hello world"๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. kivy๊ฐ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ์์ ์ผ๋ง๋ ์ ์คํ๋๋์ง ๊ธฐ์ตํ์ญ์์ค. ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์์์ง๋ง ์ผ๋ถ ์ฌ์ฉ์๋ ๊ทธ๋ ๊ฒํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ ์ค์ ์ผ๋ก ์๋ํด์ผํฉ๋๋ค. afaik, ๊ทธ๋ ์ง ์์ผ๋ฉด sdl2 ๋ํผ ๋๋ webview๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ํ๋ผ์คํฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ณ ์๋ฒ๊ฐ ๋ฌผ๊ฑด์ ํ์ํ๊ธฐ ์ํด ๊ฐ์ฅ ๋จผ์ ํ ์คํธ๋ฅผ ๊ฑฐ์น ํค๋น ์๋ฒ๋ก ๋จผ์ ์๋ํ ๊ฒ์ ๋๋ค.
Android์ฉ์ผ๋ก ๋น๋ํ๋ ค๋ฉด Linux ๋๋ osx ๋จธ์ (VM์ ๊ด์ฐฎ๊ณ Windows 10์ WSL์ ๊ด์ฐฎ์)์ด ํ์ํฉ๋๋ค.
python-for-android์ฉ jpype ๋ ์ํผ ์์ ์ ์์ํ๋ ๊ฒฝ์ฐ ๋ ผ์๊ฐ ์์ ์ ์๋๋ก ์งํ ์ค์ธ PR์ ์ฌ๋ ๊ฒ์ ํ์ํฉ๋๋ค. ์๋ํ๋ค๋ฉด ํนํ ์ค๋ ์ง์๋์ด์จ pyjnius ์ ํ ์ฌํญ์ ์ค์ ๋ก ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ค๋ ๋์ ์๋ถ๋ถ์์ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด, pyjnius๋ ๋ณธ์ง์ ์ผ๋ก kivy ์ฌ์ฉ์ ๋ํ ํต์ฌ ์๊ตฌ ์ฌํญ์ ๋ค๋ฃจ์ง๋ง, ์ด๋ฅผ ํจ์ฌ ๋ฐ์ด๋์ ๋งํผ ์ถฉ๋ถํ ๊ฐ๋ฐ ๋ฅ๋ ฅ์ด ์์ต๋๋ค.
@inclement jpype-project/jpype#799์์ Android ํฌํธ์ ๋ํ PR์ ์ค์ ํ์ต๋๋ค. ๋ถํํ๋, ๋๋ ์ฌ๊ธฐ์์ ์ด๋๋ก ๊ฐ์ผํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ๋น๋ ๊ฒฝ๋ก๊ฐ ์๋ gradle์ ์คํํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ํํด์ผ ํ ์กฐ์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ผ๋ถ ๋ฌธ์๋ฅผ ์ดํด๋ณด์์ง๋ง ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋์ ๋๋ ๊ฒ์ ์์์ต๋๋ค. ๋ด ํ๋ก์ ํธ ๋ ์ด์์์ ๊ธฐ๋ณธ ๋ชจ๋ ์๋์ ๋ชจ๋ ๊ฒ์ ๋ฃ์ง ์๊ธฐ ๋๋ฌธ์ ํ์์ ๋ค์ ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์์ ์ ์ํํ๊ณ gradle ์คํ๊ณผ ๊ฐ์ ๋ฐ๋์งํ์ง ์์ ํจํด์ ๋นํ์ฑํํฉ๋๋ค(๋ด๊ฐ ๋งํ ์ ์๋ ์ ์ฉํ ์์ ์ ์ํํ์ง ์๋ ํ).
์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ๋น๋ ๊ฒฝ๋ก๊ฐ ์๋ gradle์ ์คํํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Gradle์ APK ํจํค์ง์ ๋ง์ง๋ง ๋จ๊ณ๋ก ์ฌ์ฉ๋๋ ๋น๋ ๋๊ตฌ์ด๋ฉฐ ์๋ง๋ jpype๋ฅผ ํฌํจํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ ๊ฒ์ ๋๋ค.
๋ชจ๋ jpype/*.py ํ์ผ์ ๋น๋(๋๋ ์ฌ์ ์ปดํ์ผ๋ ๋ฒ์ )์ ํฌํจํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก jpype๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ฐ Python ๋ชจ๋๋ก ์ํ๋๋ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ๋ ์ํผ ์๋๋ ์๋ง๋ ๋๋ถ๋ถ์ ์ด๋ ค์ด ์์
์ ์ํํ ๊ฒ์
๋๋ค. CppCompiledComponentsPythonRecipe
๋ python setup.py build_ext
๋ฐ python setup.py install
์คํ๊ณผ ๊ฐ์ ์์
์ ์ํํฉ๋๋ค. NDK ํ๊ฒฝ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฑ ๋ด๋ถ์ ํฌํจํ๊ธฐ ์ํด ๋น๋๋๋ Python ํ๊ฒฝ ๋ด์ jpype python ํจํค์ง๊ฐ ์ค์น๋ฉ๋๋ค.
๋น๋์ jar ํ์ผ(๋๋ ์ด์ ์์ํ๋ ํ์ผ)์ ํฌํจํฉ๋๋ค.
์ด๊ฒ์ ์๋ง๋ ๋ ์ํผ๊ฐ ์ํํด์ผ ํ๋ ์ถ๊ฐ ๋จ๊ณ์ผ ๊ฒ์ ๋๋ค. ์ด๋ python-for-android๊ฐ ๋น๋ ์ค์ธ Android ํ๋ก์ ํธ ๋ด์ ์ ์ ํ ์์น์ jar ํ์ผ(๋๋ ํ์ํ ๋ชจ๋ ๊ฒ)์ ๋ณต์ฌํ๋ ๊ฒ์ ๋๋ค.
native/common ๋ฐ native/python์ C++ ์ฝ๋๋ฅผ ๋น๋์ ํฌํจํ _jpype๋ผ๋ ๋ชจ๋๋ก ์ปดํ์ผํฉ๋๋ค.
์ด๊ฒ์ด setup.py์ ์ํด ์ฒ๋ฆฌ๋๋ค๋ฉด ์ด๊ฒ์ ์ด๋ฏธ ์๋ํ๊ณ ์์ง๋ง ์ฝ๊ฐ์ ์กฐ์ ์ด ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ ์ํผ์ ์ปดํ์ผ ๋ช
๋ น์ ํฌํจํ ์ ์์ต๋๋ค(๋ค๋ฅธ ๋ ์ํผ์์ self.get_env
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฃ๋จ์ ๋ณผ ์ ์๋ฏ์ด ์ ์ ํ env ๋ณ์๋ฅผ ์ค์ ํ์ฌ Android ํ๊ฒฝ์ฉ์ผ๋ก ๋น๋ํ๋๋ก ํจ).
์ฌ์ฉ์ ์ ์ ๋ถํธ์คํธ๋ฉ์ ์ฌ์ฉํ์ฌ JVM ๋ฐ ์ปดํจ๋์ธ jar ํ์ผ์ ๋ก๋ํ๊ณ ๋ชจ๋ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํ๋๋ก C++ ์ฝ๋๋ฅผ ํจ์นํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ Android JNI ์ธํฐํ์ด์ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋ผ ์ด ๋ถ๋ถ์ด ์๋นํ ๊ฐ๋จํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์๋ฅผ ๋ค์ด ์ด ํจ์น ์์ ์ ์ ์๋ฏ์ด ๋ค๋ฅธ ๋์ฐ๋ฏธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค๋ฅธ ๋ฉํ๋ ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์กฐ๊ฑด๋ถ ์ปดํ์ผ์ ์ํํ๋ ๋์ pyjnius๋ฅผ ํจ์นํ์ฌ ์ฝ๊ฐ ํดํน๋ ๋ฐฉ์์ผ๋ก ์ด ์์ ์ ์ํ
jvmfinder๋ฅผ android์์ ์๋ํ๋ ๊ฒ์ผ๋ก ํจ์นํ๊ณ "startJVM"์ main์ด ์์๋ ๋๊ฐ ์๋๋ผ ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
JVM์ ๋ํด ์ ์์ง๋ ๋ชปํ์ง๋ง Android๋ ํญ์ ๊ธฐ์กด jvm์ ์ก์ธ์คํ๊ธฐ๋ฅผ ์ํ๊ณ ์ ์ธ์คํด์ค๋ฅผ ์์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ ๋ฌธ์ ๊ฐ ๋ ๊น์(์๋๋ฉด ๊ทธ๋ฅ ์๋ชป๋ ๊ฑด๊ฐ์?)?
native/build.xml์์ Apache ant๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ jar ํ์ผ์ ์ก์ธ์คํ ์ ์๋ ์์น์ ๋ฐฐ์นํฉ๋๋ค.
์ต์ํ์ง ์์์ ์ด๊ฒ์ ๋ํด์๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๋จ์ง ๋ด๋ถ jpype ๋น๋ ๋จ๊ณ์ ๋๊น? Java ๋ฒ์ ์ด ์ด๋ป๊ฒ ์ํธ ์์ฉํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฌ๊ธฐ์์๋ ์์คํ ๋ค์ดํฐ๋ธ ๊ฐ๋ฏธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
buildozer๊ฐ setup.py๋ฅผ ์กด์คํ์ง ์๋๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๋ฏ๋ก ๋งจ ์์์ gradle ๋จ๊ณ๋ก ์ง์ ๊ฑด๋๋๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ค๊ฐ ๋จ๊ณ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์ setup.py๋ jar ํ์ผ์ dll๊ณผ ๋ณํฉํ๊ธฐ ์ํด ํํฌ ํ์ผ์ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ง์ ์ฌ์ฉ์ ์ ์ ์ปดํ์ผ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค. ์ด ๋จ๊ณ๋ ์ฌ๊ธฐ์ ์ ์ฉ๋์ง ์์ ์ ์์ผ๋ฏ๋ก ๊ฑด๋๋ฐ์ด๋ ๊ด์ฐฎ์์ง๋ง cpp ๋ฐ Java ํ์ผ๋ ์ฐพ์ง ๋ชปํ์ต๋๋ค. setup.py์ ์ ์๋์ด ์์ต๋๋ค. ๋ฌธ์ ์ ์ผ๋ถ๋ ๋ด setup.py๊ฐ ๋๋ฌด ์ปค์ setupext ๋ชจ๋๋ก ๋ถํ ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋จผ์ ํ๋ก์ธ์ค๋ฅผ ํ ๋ฒ ์คํํ๊ณ ๋ก๊ทธ๋ฅผ ํ์ํ ์ ์๋๋ก clean ๋ช ๋ น์ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์์ผ ํฉ๋๋ค. (๋๋ ํ๋ ์ดํ๋ฉด์ ์ฒ์์ผ๋ก ์กฐ๊ฐ ์์ฌ๋ฅผ ์คํํ์ต๋๋ค. ๊ทธ๋์ ๊นจ๋ํ ๋ก๊ทธ๊ฐ ์์ต๋๋ค.) ๋ํ ์ฐ๋ฆฌ๋ ์ด ๋ํ๋ฅผ PR๋ก ์ฎ๊ฒจ์ ์ค๋ ๋์ ๋ํ ์ฃผ์ ์ ๋ ๋จธ๋ฌผ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
FWIW Android๊ฐ ์๋ ํ๋ก์ ํธ์ ํต์ฌ์ JPype๋ก ์ด์ํ ์ ์์์ต๋๋ค. ๋ ๊ฐ์ง ์ฌ์ํ ์ด๋ ค์์ด๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
classpath
์์ kwarg jpype.startJVM()
์๊ด์์ด ๋ด๊ฐ ๋ญ ๋ฌด์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ํ์ง๋ง addClassPath()
๊ธฐ๋ฅ์ ์๋ํ์ต๋๋ค. ํด๋์ค ๊ฒฝ๋ก ์์์ ๊ด์ฌ์ด ์๋ ๊ฐ๋ฐ์๋ jnius_config.add_classpath()
์ฌ์ฉ ๋ฐฉ์๊ณผ ๋น๊ตํ์ฌ ์ฝ๊ฐ์ ์กฐ์ ์ด ํ์ํ ์ ์์ต๋๋ค.
Java ์ธํฐํ์ด์ค ๊ตฌํ์ ํ๋ฅญํ๊ฒ ์๋ํ์ง๋ง ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค. ๋ด ์ฝ๋์๋ Python ๋ฌธ์์ด ๋ชฉ๋ก์ ๋ฐํํ๋ ํจ์๊ฐ ์์์ต๋๋ค. ๋์ด์ผ๋ณด๋ฉด ์๋ง ๊ฐ ๋ฌธ์์ด์ Java ๋ฌธ์์ด๋ก ๋ณํํ์ด์ผ ํ์ ๊ฒ์
๋๋ค. ํ์ง๋ง ๋๋ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ์ง ์์๊ณ ์ธํฐํ์ด์ค ํจ์ ์ ์๊ฐ ์ด๊ฒ์ด ์๋ํ๋๋ก ํ๊ธฐ ์ํด Java ๊ฐ์ฒด ๋ชฉ๋ก์ ๋ฐํํ๋๋ก ํ์ต๋๋ค. ์ด๋ pyjnius์์ ์ ์๋ํ์ฌ python ๋ฌธ์์ด์ Java ๊ฐ์ฒด์ ํ์ ํด๋์ค๋ก ํจ๊ณผ์ ์ผ๋ก ๋ง๋ญ๋๋ค. JPype์์๋ ์๋ํ์ง ์์ง๋ง JPype์ JString
ํด๋์ค๋ก ๋ฌธ์์ด์ ๋ณํํ์ฌ ์ฝ๊ฒ ์์ ํ์ต๋๋ค.
๊ตฌํ๋ ๋ฉ์๋์ ๋ํด @JOverride
๋ฅผ ์์ฑํ๋ ๊ฒ์ @java_method('(Ljava/lang/String;[Ljava/lang/Object;)V')
์ ๊ฐ์ ์ฝ๋๋ณด๋ค ํจ์ฌ ๊ฐ๋จํฉ๋๋ค.
์ด ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์๋ํ์ต๋๋ค. ๋ณ๊ฒฝํด์ผ ํ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ ๋ฌํ๋ ์ผ๋ถ ์ฝ๋๊ฐ ์์ง๋ง JPype๋ ์ด๋ฅผ ์ ์ง์ํฉ๋๋ค. ๋ํ JPype์ ์์์ ์ ํ ๋ณํ์ ๋งค์ฐ ํธ๋ฆฌํ๋ฉฐ ์ฌ๊ธฐ์ ๊ธฐ ๋ฟ๋ ค์ผ ํ๋ ๋ง์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค.
@Thrameos ์ฌ๊ธฐ์์ ๋น์ ์ ๊ฒฐ๋จ์ ์กด์คํฉ๋๋ค. JPype๊ฐ Android์์ ์๋ํ๋๋ก ํ๋ ํ์ด์ ๋น๋๋ค.
๋๊ธ ๊ฐ์ฌํฉ๋๋ค.
ํด๋์ค ๊ฒฝ๋ก์์ ๋ฌด์์ด ์๋ชป๋ ์ ์๋์ง ํ์คํ์ง ์์ง๋ง ๊ทธ๊ฒ์ด Python์ ์์ํ๋ ๊ณณ์ผ ๊ฒ์ด๋ผ๊ณ ์ถ์ธกํด์ผ ํ๋ค๋ฉด. ๋๋๋ก ์ฌ๋๋ค์ ๋ชจ๋์์ JVM์ ์์ํ๊ณ ์์ ๋๋ ํ ๋ฆฌ์ ๋ํ Java ๊ฒฝ๋ก ๋ฐ Python ๊ฒฝ๋ก์ ๋ํ ๊ท์น์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ jar๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. (์ด ๋ฌธ์ ์ ๋ํ ์ฌ์ฉ์ ๊ฐ์ด๋ ์น์ ์ด ์์ต๋๋ค.)
๋๋ ๋งค์ผ classpath ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉฐ ์ด๊ฒ์ ์ฐ๋ฆฌ ํ ์คํธ ํจํด์ ์ผ๋ถ์ ๋๋ค. ๋ฐ๋ผ์ ํด๋์ค ๊ฒฝ๋ก๊ฐ ์กด์ค๋์ง ์์ผ๋ฉด ๊ฝค ํฐ ์คํจ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ, ๋ณต์กํ ํจํด์ ์๋์ํค๋ ๋ฐ ํ์ํ ๋ง๋ฒ ๊ฐ์ ์์น์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๋ ์ฒซ ๋ฒ์งธ ์ฌ๋์ ์๋๋๋ค.
๋ค์์ ๊ฐ๋ฐ ์์ญ์ ๊ธฐ์ค์ผ๋ก Py ๋๋ ํ ๋ฆฌ์์ ํ ์คํธ ์์คํ ์ ์์ํ๋ ์์ ๋๋ค.
import jpype
import os
devel = os.path.dirname(__file__)
devel = os.path.join(devel, '..', '..')
devel = os.path.abspath(devel) # Notice that I converted the path to absolute so that it doesn't matter where the
# PWD of Java will be when this script is called. Otherwise, if I import this from a different location it will use the
# original PWD and Java will find nothing in the classpath.
classpath = [
'%s/gov.llnl.math/dist/*' % devel,
'%s/gov.llnl.rdak/dist/*' % devel,
'%s/gov.llnl.rnak/dist/*' % devel,
'%s/gov.llnl.rtk/dist/*' % devel,
'%s/gov.llnl.rtk.gadras/dist/*' % devel,
'%s/gov.llnl.rtk.response/dist/*' % devel,
'%s/gov.llnl.utility/dist/*' % devel,
]
jpype.startJVM(classpath=classpath, convertStrings=False)
์๋ ๊ฒฝ๋ก์ ์ ๋ ๊ฒฝ๋ก๊ฐ ์๋ํ์ง๋ง ์์ ์์น์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค. addClassPath์๋ ๋ชจ๋ ๊ฒฝ๋ก๊ฐ ํธ์ถ์ ์์น์ ๊ด๋ จ๋์ด ์๋์ง ํ์ธํ๋ ํน๋ณํ ๋ง๋ฒ์ด ์์ต๋๋ค. classpath ํค์๋ ์ธ์์๋ ๋์ผํ ๋ ผ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์์ด ๋ชฉ๋ก์ ๋ฐํํ๋ ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ํธ๋ฆฌ๊ฑฐ๋๋ ๋์์ ๋ํ ๋ฐํ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ๋ฉ์๋๊ฐ String[]
๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ ์ธ๋ ๊ฒฝ์ฐ ๋ฐํํ ๋ ๊ฐ Python ๋ฌธ์์ด์ Java๋ก ๊ฐ์ ์คํํด์ผ ํฉ๋๋ค. ๋ฉ์๋๊ฐ List<String>
๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ ์ธ๋ ๊ฒฝ์ฐ Java ์ ๋ค๋ฆญ์ด ์ด๋ฅผ ์ ๊ฑฐํ์ฌ List<Object>
๊ฐ ๋ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. JPype๊ฐ ๋ชฉ๋ก์ ๋ณด๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ณํ์ ์๋ํ๊ฑฐ๋ ์๋ํ์ง ์์ ์ ์์ง๋ง ์ด๋ ์ ์๋ ๋์์ด๋ฏ๋ก ํ์ธํ๊ฒ ์ต๋๋ค. ์์ ํ ์๋ฃจ์
์ ๋ฐํ์ ์ํด ๋ชจ๋ ํญ๋ชฉ์ ๋ณํํ ์ ์์ด์ผ ํ๋ ๋ชฉ๋ก ์ดํด์
๋๋ค.
ํด๋์ค ๊ฒฝ๋ก์์ ๋ฌด์์ด ์๋ชป๋ ์ ์๋์ง ํ์คํ์ง ์์ง๋ง ๊ทธ๊ฒ์ด Python์ ์์ํ๋ ๊ณณ์ผ ๊ฒ์ด๋ผ๊ณ ์ถ์ธกํด์ผ ํ๋ค๋ฉด. ๋๋๋ก ์ฌ๋๋ค์ ๋ชจ๋์์ JVM์ ์์ํฉ๋๋ค.
๊ทธ๊ฒ ๋ด๊ฐ ํ๋ ์ผ์ด์ผ!
๋๋ ๋งค์ผ classpath ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉฐ ์ด๊ฒ์ ์ฐ๋ฆฌ ํ ์คํธ ํจํด์ ์ผ๋ถ์ ๋๋ค. ๋ฐ๋ผ์ ํด๋์ค ๊ฒฝ๋ก๊ฐ ์กด์ค๋์ง ์์ผ๋ฉด ๊ฝค ํฐ ์คํจ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ, ๋ณต์กํ ํจํด์ ์๋์ํค๋ ๋ฐ ํ์ํ ๋ง๋ฒ ๊ฐ์ ์์น์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๋ ์ฒซ ๋ฒ์งธ ์ฌ๋์ ์๋๋๋ค.
์, ์ด๊ฒ์ ๋น์ ์ด ์ฆ์ ์์์ฐจ๋ฆด ์ ์๋ ๊ฒ์ด๋ฉฐ ๋ด๊ฐ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช์ ์ฒซ ๋ฒ์งธ ์ฌ๋์ด ์๋๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋์์ด ๋๋ ์ฝ๋ ์ํ์ ์ ๊ณตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ผ๋ถ ๊ฐ์ ํ์ต๋๋ค.
์์ ํ ์๋ฃจ์ ์ ๋ฐํ์ ์ํด ๋ชจ๋ ํญ๋ชฉ์ ๋ณํํ ์ ์์ด์ผ ํ๋ ๋ชฉ๋ก ์ดํด์ ๋๋ค.
๊ทธ๊ฒ์ด ๋ด๊ฐ ํ ์ผ์ด๋ฉฐ ์ง๊ธ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค. ๊ฐ์ฌ ํด์!
๋ช ๋ ์ ์ py4j์ jnius๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ jnius๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
์ฅ์์์ ์ธ๊ธ๋ jpype๋ฅผ ๋ณด์์ ๋ ํญ์ - http://jpype.sourceforge.net/ ์ ์ฐธ์กฐํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ ์ง ๊ด๋ฆฌ๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๋ฉ๋ฆฌํ์ต๋๋ค(์ ํ๋ก์ ํธ๋ฅผ ์ด์ํ๊ฒ ๋ณด์ง ๋ชปํจ)
์ด ์ค๋ ๋๋ฅผ ์ฝ์ผ๋ฉด์ ๋ฒค์น๋งํฌ๋ฅผ ๋ค์ ์๋ํ์ต๋๋ค.
์ผ๋ถ ๊ฒฐ๊ณผ:
https://gist.github.com/AbdealiJK/1dd5b7677435ba22f9ab3e26016bb3e7
# jpype
# createjvm: 0.550s
# loadmodel: tot=1.466451 max=1.064521s avg=0.014665s
# fields : tot=0.019881 max=0.009795s avg=0.000199s
# score : tot=0.033356 max=0.023338s avg=0.000334s
# jnius
# createjvm: 0.249s
# loadmodel: tot=1.773011 max=1.385274s avg=0.017730s
# fields : tot=0.039058 max=0.012234s avg=0.000391s
# score : tot=0.067590 max=0.031904s avg=0.000676s
# py4j
# createjvm: 0.222s
# loadmodel: tot=0.616913 max=0.027464s avg=0.006169s
# fields : tot=0.699152 max=0.026426s avg=0.006992s
# score : tot=0.389583 max=0.017620s avg=0.003896s
๊ณต์ ํ๊ฒ ๋งํ์๋ฉด, JPype๋ 2020๋ 3์๊น์ง Python(CPython๊ณผ ๋ฐ๋)์ผ๋ก ์์ฑ๋ ํ๋ฐํธ ์๋ API๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ๋ฐ๋ผ์ JPype๊ฐ ์ ๊ณตํ๋ ๊ฒ์ ๋นํด ๋ค์ ๋๋ฆฌ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์ด์ ๋ฒค์น๋งํฌ๊ฐ ๋ง์ด ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ก ํด๊ฒฐํด์ผ ํ๋ ๋ฐฑ์๋ ๋ฌธ์ ๊ฐ ๋๋ฌด ๋ง์๊ณ Ruby, ๋ฉํฐ์ค๋ ๋ฉ ๋ฑ์ ์ง์ํ๊ธฐ ์ํด ์ ์ฒด ๋ค์ธต ๋ํผ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ๊ทธ ์๋๊ฐ ๋ง์ง๋ง ์์ ์ด์์ต๋๋ค.
์ด ์์ ์์ ๊ฝค ๋นจ๋ผ์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ํจํค์ง์ ๊ด๋ จํ์ฌ ์ถ๊ฐ ์์ ์ด ํ์ํ ๊ฒ์ ๋ฐ๊ฒฌํ๋ฉด ๋ฌธ์ ์ ๋ฉ๋ชจ๋ฅผ ๋จ๊ฒจ์ฃผ์ธ์. ๋ฐํ ๊ณ์ฝ์ผ๋ก ์ธํด ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ด ์์ง๋ง ํธ์ถ, ๋ฐฐ์ด ์ ์ก ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ๋ง์ ์ํ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ ์ด ์์ ์์ ๊ฝค ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
JPype์์๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ ์์ต๋๋ค. ํนํ, numpy ๋ฐฐ์ด๊ณผ์ ํตํฉ์์ ์ข์ ๊ฐ์น๋ฅผ ์ป๊ณ ์์ต๋๋ค. ์ด์ ์๋ ํ ์ ์์๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์๋ฏธ ์๋ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์์ต๋๋ค.
๋๊ตฌ๋ ์ง kivy-remote-shell ๋๊ตฌ๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ํ์ฌ Python3 ๋ฐ buildozer๋ก ๋น๋ํ๊ณ ์ง์นจ์ ๋จ๊ณ์ ์ผ๋ก ๊ฐ์ ํ๋๋ก ์น์ ํ ์ ์๋ค๋ฉด JPype ์ด์ ๋ ธ๋ ฅ์ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๋งค์ฐ. ๋ถํ ๋ฐ ํ ์คํธ ๋จ๊ณ๊น์ง ๋ชจ๋ ํ์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถํธ์คํธ๋ฉ ํ๋ก์ธ์ค๋ฅผ ์๋ฃํ ์ ์๋ ํ๊ฒฝ์ด ์์ผ๋ฉด ์งํํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ์ด๋ฒ ์ฃผ๋ง์ ์๊ฒฉ ์ ธ ๋๊ตฌ ์ ๋ฐ์ดํธ๋ฅผ ๋ค์ ์๋ํ๊ฑฐ๋(์ฑ๊ณตํ ์ ์์) kivy์ ๋ํด ๋ ์ ์๊ณ ์๋ ์ดํด ๋น์ฌ์๊ฐ ์ด ์ ์ ์กฐ๊ฑด ์์ ์ ์๋ฃํ ์ ์์ผ๋ฉฐ ์ฃผ๋ง์ ๋ด๊ฐ ๊ฐ์ฅ ์์ฑํ ์ ์๋ ๊ธฐ์ ์์ ์ ์๋ฃํ๋ ๋ฐ ๋ณด๋ผ ์ ์์ต๋๋ค. . ๋ค๋ฅธ ์ฌ๋๋ค์ ๋๊ธฐ ์ํด ๋ด ์๊ฐ์ ์์ ๋กญ๊ฒ ์ ๊ณตํ์ง๋ง, ๋ฆฌ์์ค๋ ์ ํํ๋ฉฐ Android ์ด์ ์์ ์์ ์ํํ๋ ๋ชจ๋ ์์ ์ ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค๋ ๊ด์ฌ์ ๊ฐ๊ณ ์๋ Python from Java ๋ธ๋ฆฌ์ง์ ๋ํ ์ง์ฐ์ ๋๋ค.
๋๋ ์๋๋ก์ด๋ ํฌํ ๋ ธ๋ ฅ์ด ์ฐจ์ด์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํต์ฌ ์ฝ๋๋ฅผ ์ฌ์์ ํ๋ ๋ฐ ๋ช ์ฃผ๋ฅผ ๋ณด๋ธ PyPy ํฌํ ๋ ธ๋ ฅ์ ๊ธธ์ ๊ฐ๋ ๊ฒ์ ํผํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฐ ๋ค์ ๊ฐ์ฒด ์์คํ ์ ์ฌ์ํ ์ฐจ์ด๊ฐ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ๊ธฐ์ ์ ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. ์์ฑ๋ ์ฝ๋์์ ์์ฑ๋ ์ค๋ฅ ๋ณด๊ณ ์๋ฅผ ๋๋ฒ๊ทธํ๋ ๋ฐฉ๋ฒ์ ์ถ์ ํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ ์ฌ๋์ ์ฐพ์ ์ ์์์ต๋๋ค. ๋๋ ์์ง๋ฌ์ง ์ฐ์ ์ ๋ํด ์ธ์ง ์๊ณ JPype ์ฝ๋๋ฅผ ๋ค๋ฅธ ์๋ฏธ ์๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ๊ธฐ ์ํด ๊ทธ ๋ชจ๋ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์์ง๋ง ๊ฒฐ๊ตญ JPype๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ์ฉ์๋ ๋๊ณ ๋ฉ๋ง๋ฅธ ์ํ๋ก ๋จ์์ต๋๋ค. ์ด ๋ ธ๋ ฅ์ด ์คํจํ๋ฉด ๋ค์ ๋์๊ฐ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ด ์์ค๋๋ ๊ฒ์ ์๋์ง๋ง, ๋๊ธฐ์ด์ ๋งจ ๋์ ๋ฌด์ธ๊ฐ๊ฐ ์์ผ๋ฉด ๋๊ตฐ๊ฐ ์๊ฐ์ ๋ด์ ๋๋ฅผ ๋์์ค ์ ์๋ค๋ฉด 6๊ฐ์ ๋์ ๋ค์ ์์ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. .
์ดํด ๊ด๊ณ์๋ฅผ ์ํ ์งํ ์ํฉ ์ ๋ฐ์ดํธ.
pythonforandroid ๋ด์์ JPype๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ถํ ํ๊ณ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ํ ์คํธํ ์ ์์์ต๋๋ค. JVM์ ์ฐจ์ด๋ก ์ธํด ์ผ๋ถ ๊ณ ๊ธ ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํ์ง ์์ ์ ์์ง๋ง ๋๋ถ๋ถ์ JPype๋ Android ํ๋ซํผ์์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํฌํธ๋ buildozer ๋ฐ pythonforandroid ํ๋ก์ ํธ์ ๋ํ ์ผ๋ถ ์ ๊ทธ๋ ์ด๋๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ์ต๋๋ค(๋ฐ๋ผ์ ์์ค๋ฅผ ๋ง์ด ์ฝ๊ณ ๋์์ ์์ฒญํด์ผ ํจ). ํ ์ฃผ๋ง์ ํ๋ก์ธ์ค์ ๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ์ ์๋ฃํ ์ ์๋๋ก ์๋ตํด ์ฃผ์ ๊ฐ๋ฐ์๋ค์๊ฒ ๊น์ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค. ๊ทํ์ ์๊ฒฌ์ด ์์๋ค๋ฉด ๋ถ๊ฐ๋ฅํ์ ๊ฒ์ ๋๋ค. ๊ด๋ จ ๋ณ๊ฒฝ์ฌํญ์ PR๋ก ๋ฃ์์ง๋ง PR์ ๋ฐฑ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ๊ณ ๋ ค ๋์์ด ๋๊ธฐ๊น์ง ์๊ฐ์ด ์ข ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ด์ ํ์ํ ํต์ฌ ๊ธฐ์ ์ฌ์์ด ์์ผ๋ฏ๋ก ์ด๋ฅผ ํตํฉํ ์ ์์ด์ผ ํ๋ฉฐ ๋ช ๋ชฉ์ ๋ฆ๊ฐ์ ๋ฌ๋ ฅ์ JPype 1.2 ์ ๋์ ์์ ๋ฆด๋ฆฌ์ค ์ฝ๋๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ฌ์ฉ์์ ๊ด์ฌ์ด ํฌ๋ค๋ฉด ์ถ์งํ ์ ์์ง๋ง ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ค์ํ ๊ธฐ๋ฅ์ธ Python from Java์ ๊ฒฝ์ํ๊ณ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๋ ธ๋ ฅ์ ๊ฐ์ํํ๋ ๋ฐ ๋์์ ์ฃผ๊ณ ์ถ๋ค๋ฉด, ๋ค์ ์ด๋ ค์ด ๋จ๊ณ๋ ๋น๋๋ฅผ ์คํํ๊ณ , ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ , ํ ์คํธ ๋ฒค์น๋ฅผ ์คํํ ์ ์๋๋ก ๋ถ๋ถ ๋น๋ ์์คํ ์ผ๋ก ๋ชจ๋ ๊ฒ์ด ์ ์๋ฆฌ์ ์๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ด๋ ๊ฒ์ ๋๋ค. azure ํ์ดํ๋ผ์ธ(๋๋ ์ผ๋ถ ๋ค๋ฅธ CI ์์คํ )์ Android. ์๋ํ๋ ๊ฒ๊ณผ ์๋ํ์ง ์๋ ๊ฒ์ ๊ฐ์งํ ์ ์๋ ์๋ํ๋ CI๊ฐ ์์ผ๋ฉด ์์ ์ ์ธ ์ํํธ์จ์ด๋ก ๋ฐฐํฌํ ์ ์๋ ๋ฐ ํจ์ฌ ๋ ๊ฐ๊น์์ง ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด JPype ํ๋ก์ ํธ์ ํฌํจ๋์ด์ผ ํ๋์ง ๋๋ ๋ณ๋์ Android ํ ์คํธ ํ๋ก์ ํธ๊ฐ ์์ด์ผ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ ์ฝ 2๋ ์ ์ ๋ชจ๋ Java ๋ธ๋ฆฌ์ง ์ฝ๋์ ์ ๊ทผํ์ต๋๋ค. ๋ถํํ๋, PyJnius ์ฝ๋๋ ๋ด ๊ฒ์์ ๊ฒฐ์ฝ ๋ํ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ถ๋ช ํ ๋์ณค์ต๋๋ค. ์ง๋๋ฒ์ ๋ฉ์ง ๊ธฐ์ ๋ณด๋ ์๋ฃ๋ฅผ ์ ๊ณตํ ํ์ด์ง๋ฅผ ๊ฒ์ํ๋ค๊ฐ ๋ ํ๋ก์ ํธ์ ๋ํด ๋ ผ์ํ๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ ๊ฒ์ ์ ์ธํ๊ณ ๋ ์ด๋ฒ ๋ผ์ด๋์์๋ ๋์ณค์ ๊ฒ์ ๋๋ค. 2๋ ๋์ ๊ฐ์ ๋ถ์ผ์์ ์งํ ์ค์ธ ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ๋์ณค๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ถ๋ช ํ ๋ด ์๋ชป์ด์์ต๋๋ค.
JPype๊ฐ ๋ค๋ฅธ ์ฃผ์ ๋ธ๋ฆฌ์ง ์ฝ๋์ธ Py4J์ ํผ๋๋๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๊ทธ๋ค์ ์๋ฐ๋๋ ์ด์ ๊ณผ ๋จ์ ์ ๋ชจ๋ ๊ฐ์ง ์์ผ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ ์ํํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ก์ ํธ๊ฐ ๋ด ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ง ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๋๋ ์๋๋ก์ด๋๋ฅผ ์ง์ํ๋ ๋ฐ ํ์ํ ๊ฒ์ ๋ํ ์ฐ๊ตฌ๋ฅผ ํ์ง ์์์ต๋๋ค. ๋น๋ก ๋ด๊ฐ ๊ฐ๋ฅํ ๊ฒ๋ณด๋ค ์ฝ๊ฐ์ ๊ธฐ์ ์ฌ์์ด ์๋ค๋ฉด. ๋ค์ดํฐ๋ธ JNI์ Python์ C API์ ๋ํ ์ผ๋ฐ ์ด์ ํธ์ถ ์ธ์๋ ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์๋ ์์ ์ด ์์ต๋๋ค.
์ ๊ทผ ๋ฐฉ์์ ๊ดํ ํ JPype๋ "startJVM()" ๋ช ๋ น์ ์ฌ์ฉํ์ฌ JVM์ Python๊ณผ ๊ฒฐํฉํ๊ธฐ ์ํด ๋ ์ ์ ์ผ๋ก JNI๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ๋ฒ์ (2.0)๋ Java ๋ด์์ Python์ ์์ํ ์ ์๋ ๋ฐ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค. ๋ ์ด์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด ์ด ์์ ์ ์ํํฉ๋๋ค. ํ๋ก ํธ ์๋ ์ญํ ์ ํ๋ ๋ชจ๋ ๊ณ ๊ธ ํด๋์ค๋ฅผ ๋ณด์ ํ๋ Python ๊ณ์ธต, ์ง์ ์ ์ ๋ณด์ ํ๋ ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์๋ CPython ๊ฐ์ธ ๋ชจ๋, ๋ชจ๋ ์ ํ ๋ณํ ๋ฐ ์ผ์น๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ธฐ๋ณธ ๋ชจ๋๋ก ์๋ํ๋ C++ ์ง์ ๊ณ์ธต์ด ์์ต๋๋ค. Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ชจ๋ ์ ํธ๋ฆฌํฐ ์์ (๊ฐ์ฒด ์๋ช ์ ์ง, ์ฌ๋ผ์ด์ค ๋ฐ ์์ธ์ ๋ํ ์ง์ ํด๋์ค ์์ฑ, javadoc ์ถ์ถ๊ธฐ/๋ ๋๋ง)์ ์ํํ๋ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
8๋ ์ JPype๋ ์ฝ๊ฐ ์๋ง์ด์์ต๋๋ค. Ruby์ Python์ ๋ชจ๋ ์ง์ํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ C++ ๋ ์ด์ด๋ ์์ ํ ๋ํผ๊ฐ ์ฝํ ์๊ณ ํ๋ฐํธ ์๋๋ ๋ชจ๋ Python์ผ๋ก ๋์ด ์์ด์ ๋งค์ฐ ๋๋ ธ์ต๋๋ค. ๋ํ numpy ์ง์์ด ์ปดํ์ผ๋์ด ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋ฐํ๋ ์ ์์ผ๋ฏ๋ก ๋ฐํ ์ ํ์์ ๋ถ๊ธฐ๋์์ต๋๋ค. ๋ค์ดํฐ๋ธ Python๊ณผ Java ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ํ๋ก์ ์ญํ ์ ํ๋ ค๋ฉด JException๊ณผ ๊ฐ์ ๋ง์ ์ด๋ํฐ ํด๋์ค๊ฐ ํ์ํ์ต๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ์ ํฉ๋ฅํ ์ง 3๋ ๋ง์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. JPype์ ๋ ๊ฐ์ง ์ฃผ์ ๋ชฉํ(์ ๋ฅผ ์ํด)๋ ๋ฌผ๋ฆฌํ์๋ค์ด ํ๋ก๊ทธ๋๋ฐ์ ์ต์ํ์ฌ Java๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ๊ณผํ์ ์ธ Python ์ฝ๋์ ๋์ ์์ค์ ํตํฉ์ ๊ฐ์ง ์ ์์ ๋งํผ ์ถฉ๋ถํ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์๋ฐ๊ฐ ์ง์ํ๋ ๊ฐ์ฒด๊ฐ "๋ชจ๋ ์ฅ์" CPython ๊ฐ์ฒด ๋ํผ๋ฅผ ๊ฐ๋๋ก ํจ์ผ๋ก์จ ์ด๋ฅผ ์ํํฉ๋๋ค. Java ์์ ๋ฐฐ์ด์ ๋ณํํ๋ ๋์ Java ์์ ๋ฐฐ์ด์ numpy์ ๋์ผํ ์ง์ ์ ์ ๋ชจ๋ ๊ตฌํํ๋ ์๋ก์ด ์์ Python ์ ํ์ผ๋ก ๋ง๋ค๊ณ ์ด ๋ชจ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ์ ์ก์ผ๋ก ์ง์๋ฉ๋๋ค. ๋ฐ๋ผ์
list(jarray)
๋๋np.array(jarray)
๋ฅผ ํธ์ถํ์ฌ ๋น ๋ฅธ ๋ณํ์ด ๊ฐ๋ฅํฉ๋๋ค.Android์ ์ ์ฉํ๋ ค๋ฉด ์์ ์ํ์ค๋ฅผ ๋ค์ ์์ ํด์ผ ํ๋ฉฐ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฝํฌ ์ฝ๋๋ฅผ ๋ณด๋ค ์ ํต์ ์ธ JNI ๋ชจ๋ธ๋ก ๊ต์ฒดํด์ผ ํฉ๋๋ค. ๋ค์ ๋ฒ์ ์์ ์ด๋ฏธ ์ฝํฌ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ผ๋ฏ๋ก ์ดํ ๋ฒ์ ์ ์ด๋ฏธ ์ถฉ์กฑ๋์์ต๋๋ค. ์ ์๋ง ํ์ํฉ๋๋ค.
๋ด๊ฐ ๋ณผ ์์๋ ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ์ฐจ์ด์ ์ PyJnius๊ฐ ๋ฐฐ์ด์ ์ค๊ฐ๋ ๋ฐฐ์ด์ ๋ณํํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ํฐ ๋ฐฐ์ด(์ข ์ข ๋ณํ๋์ง ์์)์ ๋ค๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์ ํธ๋๋ JPype ์คํ์ผ์ธ ๊ณผํ์ ์ฝ๋ฉ์ ๋งค์ฐ ๊ธ์ง๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ณํ์ ์๊ตฌํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ๊ฐ์ ์ํ ์ ๋ฌ ๋ฐ ์ฐธ์กฐ์ ์ํ ์ ๋ฌ๊ณผ ๊ฐ์ ์ต์ ์ด ๊ฐ์ ์ ์ฉ๋์ง๋ง, ์ด๋ ๋ค์ค ์ธ์ ํธ์ถ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ชจ๋ ์ธ์์ ๋ํด ํ๋์ ์ ์ฑ ์ ์ ํํ๋ ๊ฒ์ฒ๋ผ ์ ์ฌ์ ์ผ๋ก ๋ ํฐ ๋ฌธ์ ๋ก ์ด์ด์ง๋๋ค. ๋ํ ๋ค์ฐจ์ ๋ฐฐ์ด์ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. (
obj.method(1, jnius.byref(list1), list2)
์ ๊ฐ์ด ์ฌ์ฉ๋๋ ์ด๋ํฐ ํด๋์ค๊ฐ ๋ฌ์ฑ๋ ์ ์๋ค๋ฉด ๋ ๋์ ์ ์ด๋ฅผ ์ ๊ณตํ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.) ์ด ์ธ์๋ GC ์ฐ๊ฒฐ, ํธ์ถ์์ ๋ฏผ๊ฐํ ๋ฉ์๋ ๋ฑ JPype๊ฐ ํด๊ฒฐํ ๋ฌธ์ ๊ฐ ๋ง์ต๋๋ค. ๋ค๋ฅธ ๊ฒ์ด ์๋ค๋ฉด JPype ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์ฌ์ฉํ ์ ์๋ ์ข์ ์์ด๋์ด๊ฐ ์๋์ง ํ์ธํ์ญ์์ค.