์ฌ๋ฌ ์์ฑ์๊ฐ ์๋ Java ํด๋์ค๋ฅผ ์ฒ๋ฆฌํ ๋ pyjnius์์ ๋ฒ๊ทธ๋ฅผ ์ฐพ์์ต๋๋ค.
์๋ ์๋ฐ ์ฝ๋๋ฅผ ์คํํ์ ๋ ๋ฉ์ธ ๋ฉ์๋๋ ๋ ๋ฒ์งธ ์์ฑ์๋ฅผ ํธ์ถํ๊ณ ์ ์์ ์ผ๋ก ์ข
๋ฃ๋ฉ๋๋ค.
์๋ python ์ฝ๋๋ฅผ ์คํํ๋ฉด ์์ฑ์๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ๋ณด๊ณ ํฉ๋๋ค.
(jnius.JavaException: No constructor matching your arguments, available: ['(ILjava/lang/String;)V', '(ILjava/lang/String;Ljava/lang/Object;[I)V'])
๊ทธ๋ฌ๋ Java ์ฝ๋์์ ์ฒซ ๋ฒ์งธ ์์ฑ์๋ฅผ ์ ๊ฑฐํ๋ฉด pyjnius๊ฐ ํฌํจ๋ Python ์ฝ๋๊ฐ ์ ์ผํ ์์ฑ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐพ๊ณ ์ ์์ ์ผ๋ก ์๋ฃํ ์ ์์ต๋๋ค.
์๋ฐ ํด๋์ค
public class SampleJavaClass {
public SampleJavaClass( int arg1, String arg2, int arg3, Object arg4, int... arg5 ) {
System.out.println("arg1: " + Integer.toString(arg1));
System.out.println("arg2: " + arg2);
System.out.println("arg3: " + arg3);
System.out.println("arg3: " + arg4);
System.out.println("arg4: " + arg5.toString());
}
// the constructor plans to use
public SampleJavaClass (int arg1, String arg2, Object arg3, int... arg4) {
System.out.println("arg1: " + Integer.toString(arg1));
System.out.println("arg2: " + arg2);
System.out.println("arg3: " + arg3);
System.out.println("arg4: " + arg4.toString());
}
public static void main(String[] args) {
SampleJavaClass test = new SampleJavaClass(1, "var2", null, 4);
}
}
pyjnius๋ฅผ ์ฌ์ฉํ ํ์ด์ฌ ์ฝ๋
import os
currentPath = os.getcwd()
classpath = currentPath + "/SampleJavaClass.class"
import jnius_config
jnius_config.set_classpath('.', classpath)
from jnius import autoclass
def main():
SampleJavaClass = autoclass("SampleJavaClass")
SampleJavaClass(1, "var2", None, 4)
print("Execution finished!")
if __name__ == "__main__":
main()
์์ฑ์ ์๋ช ํํธ๋ฅผ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น?
์์ ๋ https://github.com/kivy/pyjnius/blob/307659b13c1e5583fcb25603b7d3732265ffd4a0/tests/test_constructor.py#L54 ๋ฅผ ์ฐธ์กฐ
pyjnius๋ ๋ฉ์๋๋ ์์ฑ์๋ฅผ ํธ์ถํ ๋ ๋จผ์ ์ฃผ์ด์ง ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์๋ ๋ฉ์๋๊ฐ 0๊ฐ, 1๊ฐ ๋๋ ์ฌ๋ฌ ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. 1๊ฐ๋ง ์์ผ๋ฉด ํญ์ ์ ํ๋ฅผ ๊ฑธ๊ณ ์ต์ ์ ๋คํฉ๋๋ค. ์ฌ๋ฌ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ด ํ์ฉ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ด ์ฑ์ ํ๋ก์ธ์ค๋ฅผ ์ํํฉ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ํ๋๋ง ํ์ฉ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ์์ฑ์๊ฐ ํ์ฉ๋์ง ์์ผ๋ฏ๋ก ๋ ๋ค ๊ฑฐ๋ถํฉ๋๋ค. ์๋ช ํํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ๋งค๊ธฐ๊ธฐ ๊ณผ์ ์ ๊ฑด๋๋ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ช ํํธ๋ ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์์ธํ ์ดํด๋ณด๊ณ ์ค์ ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋ฒ๊ทธ๊ฐ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋คํ์ค๋ฝ๊ฒ๋ ๊ทธ๊ฒ์ ์ฝ๊ฒ ๊ณ ์น ์ ์์ต๋๋ค. ์ ์ ํ ๋จ์ ํ ์คํธ๋ก PR์ ํด๋ณด๊ฒ ์ต๋๋ค.
์์ฑ์ ์๋ช ํํธ๋ฅผ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น?
๋ณด๋ค
์๋ฅผ ๋ค์ด.
๋ฐฉ๊ธ ์๋ ์ฝ๋์ ๊ฐ์ด ์๋ช ์ ์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง ์ด์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด๊ฐ ์ด๋๋ฅผ ๋ง์ณค์ด?
์ค๋ฅ
File "jnius/jnius_export_class.pxi", line 270, in jnius.JavaClass.__init__
File "jnius/jnius_export_class.pxi", line 319, in jnius.JavaClass.call_constructor
AssertionError
pyjnius๋ฅผ ์ฌ์ฉํ ํ์ด์ฌ ์ฝ๋
import os
currentPath = os.getcwd()
classpath = currentPath + "/SampleJavaClass.class"
import jnius_config
jnius_config.set_classpath('.', classpath)
from jnius import autoclass
def main():
SampleJavaClass = autoclass("SampleJavaClass")
SampleJavaClass(1, "var2", None, 4, signature="(ILjava/lang/String;Ljava/lang/Object;[I)V")
print("Execution finished!")
if __name__ == "__main__":
main()
๊ด๋ จ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
requestedDefn = kwargs.pop('signature', None)
for definition, is_varargs in definitions:
found_definitions.append(definition)
d_ret, d_args = parse_definition(definition)
if requestedDefn == definition:
assert not is_varargs
scores=[]
score=1
scores.append((score, definition, d_ret, d_args, args))
break
์๋ช ํํธ๋ฅผ ๊ฐ๋ณ ์ธ์์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ ๊ฒฝ์ฐ์ง ๋ง์ธ์. ์ ๊ฐ ์์๋๊ณ ์ด์ ๋ํ ์์ ์ฌํญ์ด ์์ต๋๋ค. PR์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
@enjoybeta PR์์ ์ด ๋ฌธ์ ๋ฅผ ์์
@cmacdonald , ์ฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ด ๋จธ๋ฆฌ ๊ผญ๋๊ธฐ์ ์๋ฌด๊ฒ๋ - varargs ์์ฑ์๋ฅผ ํธ์ถํ๋ ๋น ๋ฅธ Java ํฉํ ๋ฆฌ ํด๋์ค๋ฅผ ์ถ๊ฐํ์๊ฒ ์ต๋๊น?
์ด์จ๋ ๋ค์ Jnius ๋ฆด๋ฆฌ์ค์์ ๋ฒ๊ทธ๊ฐ ์์ ๋๋ฏ๋ก ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์ ์๋ค๊ณ ์ ์ํฉ๋๋ค.
์ข์ ์๊ฐ! ํด๋น ์์ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ต์ ์ธ ๊ฒฝ์ฐ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ํํ๋ ๋ณ๋์ ๋์ฐ๋ฏธ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๋์ํฉ๋๋ค. ์ง๊ธ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
pyjnius๋ ๋ฉ์๋๋ ์์ฑ์๋ฅผ ํธ์ถํ ๋ ๋จผ์ ์ฃผ์ด์ง ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์๋ ๋ฉ์๋๊ฐ 0๊ฐ, 1๊ฐ ๋๋ ์ฌ๋ฌ ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. 1๊ฐ๋ง ์์ผ๋ฉด ํญ์ ์ ํ๋ฅผ ๊ฑธ๊ณ ์ต์ ์ ๋คํฉ๋๋ค. ์ฌ๋ฌ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ด ํ์ฉ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ด ์ฑ์ ํ๋ก์ธ์ค๋ฅผ ์ํํฉ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ํ๋๋ง ํ์ฉ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ์์ฑ์๊ฐ ํ์ฉ๋์ง ์์ผ๋ฏ๋ก ๋ ๋ค ๊ฑฐ๋ถํฉ๋๋ค. ์๋ช ํํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ๋งค๊ธฐ๊ธฐ ๊ณผ์ ์ ๊ฑด๋๋ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ช ํํธ๋ ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์์ธํ ์ดํด๋ณด๊ณ ์ค์ ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋ฒ๊ทธ๊ฐ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋คํ์ค๋ฝ๊ฒ๋ ๊ทธ๊ฒ์ ์ฝ๊ฒ ๊ณ ์น ์ ์์ต๋๋ค. ์ ์ ํ ๋จ์ ํ ์คํธ๋ก PR์ ํด๋ณด๊ฒ ์ต๋๋ค.