Pyjnius: ๋‹ค์ค‘(์˜ค๋ฒ„๋กœ๋“œ๋œ) ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ์ž๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 10์›” 22์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: kivy/pyjnius

์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋Š” 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()

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

pyjnius๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋จผ์ € ์ฃผ์–ด์ง„ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ 0๊ฐœ, 1๊ฐœ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 1๊ฐœ๋งŒ ์žˆ์œผ๋ฉด ํ•ญ์ƒ ์ „ํ™”๋ฅผ ๊ฑธ๊ณ  ์ตœ์„ ์„ ๋‹คํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ๊ฐ์ด ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ฑ„์  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ƒ์„ฑ์ž๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‘˜ ๋‹ค ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช… ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ์ˆ˜ ๋งค๊ธฐ๊ธฐ ๊ณผ์ •์„ ๊ฑด๋„ˆ๋›ฐ์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ช… ํžŒํŠธ๋Š” ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ค์ œ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ๊ทธ๊ฒƒ์€ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ PR์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  8 ๋Œ“๊ธ€

์ƒ์„ฑ์ž ์„œ๋ช… ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

์˜ˆ์ œ๋Š” https://github.com/kivy/pyjnius/blob/307659b13c1e5583fcb25603b7d3732265ffd4a0/tests/test_constructor.py#L54 ๋ฅผ ์ฐธ์กฐ

pyjnius๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋จผ์ € ์ฃผ์–ด์ง„ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ 0๊ฐœ, 1๊ฐœ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 1๊ฐœ๋งŒ ์žˆ์œผ๋ฉด ํ•ญ์ƒ ์ „ํ™”๋ฅผ ๊ฑธ๊ณ  ์ตœ์„ ์„ ๋‹คํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ๊ฐ์ด ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ฑ„์  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ƒ์„ฑ์ž๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‘˜ ๋‹ค ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช… ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ์ˆ˜ ๋งค๊ธฐ๊ธฐ ๊ณผ์ •์„ ๊ฑด๋„ˆ๋›ฐ์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ช… ํžŒํŠธ๋Š” ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ค์ œ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ๊ทธ๊ฒƒ์€ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ PR์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž ์„œ๋ช… ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

๋ณด๋‹ค

https://github.com/kivy/pyjnius/blob/307659b13c1e5583fcb25603b7d3732265ffd4a0/tests/test_constructor.py#L54

์˜ˆ๋ฅผ ๋“ค์–ด.

๋ฐฉ๊ธˆ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์„œ๋ช…์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์–ด์„ค์…˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ด๋””๋ฅผ ๋ง์ณค์–ด?

์˜ค๋ฅ˜

  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 ๋ฆด๋ฆฌ์Šค์—์„œ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜๋ฏ€๋กœ ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์ƒ๊ฐ! ํ•ด๋‹น ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์˜ต์…˜์ธ ๊ฒฝ์šฐ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ณ„๋„์˜ ๋„์šฐ๋ฏธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰