Pyjnius: НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π½Π°ΠΉΡ‚ΠΈ конструктор ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… (ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ…) конструкторов

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 22 ΠΎΠΊΡ‚. 2020  Β·  8ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: kivy/pyjnius

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° ошибка pyjnius ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Java-классом с нСсколькими конструкторами.

Когда я Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Java, основной ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ конструктор ΠΈ изящно Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ.
Когда я Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Python, ΠΎΠ½ сообщит, Ρ‡Ρ‚ΠΎ конструктор Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½.
(jnius.JavaException: No constructor matching your arguments, available: ['(ILjava/lang/String;)V', '(ILjava/lang/String;Ljava/lang/Object;[I)V'])
Но ΠΊΠΎΠ³Π΄Π° я ΡƒΠ΄Π°Π»ΠΈΠ» 1-ΠΉ конструктор Π² java-ΠΊΠΎΠ΄Π΅, ΠΌΠΎΠΉ ΠΊΠΎΠ΄ python с pyjnius ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ СдинствСнный конструктор ΠΈ изящно Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ.

Класс Java

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);
    }
}

Код Python с 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, ΠΎΠ½ всСгда Π΄Π΅Π»Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ², надСясь Π½Π° Π»ΡƒΡ‡ΡˆΠ΅Π΅. Если ΠΈΡ… нСсколько, ΠΎΠ½ выполняСт этот процСсс подсчСта ΠΎΡ‡ΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. НадСюсь, ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌ; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π’ этом случаС ΠΎΠ½ отклоняСт ΠΎΠ±Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конструкторы Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹. ИспользованиС подписной подсказки позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, заставляя Π΅Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ процСсс подсчСта ΠΎΡ‡ΠΊΠΎΠ². Подсказка для подписи - Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ я Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΠ» ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это ошибка, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это Π½Π΅ удаСтся. И, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, это Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. Π― сСйчас сдСлаю ΠΏΠΈΠ°Ρ€ с ΡŽΠ½ΠΈΡ‚-тСстом.

ВсС 8 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π²Ρ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ подсказку подписи конструктора?

Π‘ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ https://github.com/kivy/pyjnius/blob/307659b13c1e5583fcb25603b7d3732265ffd4a0/tests/test_constructor.py#L54 .

Когда pyjnius Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ конструктор, ΠΎΠ½ сначала провСряСт, Π΅ΡΡ‚ΡŒ Π»ΠΈ 0, 1 ΠΈΠ»ΠΈ нСсколько конструкторов ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Если Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1, ΠΎΠ½ всСгда Π΄Π΅Π»Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ², надСясь Π½Π° Π»ΡƒΡ‡ΡˆΠ΅Π΅. Если ΠΈΡ… нСсколько, ΠΎΠ½ выполняСт этот процСсс подсчСта ΠΎΡ‡ΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. НадСюсь, ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌ; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π’ этом случаС ΠΎΠ½ отклоняСт ΠΎΠ±Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конструкторы Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹. ИспользованиС подписной подсказки позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, заставляя Π΅Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ процСсс подсчСта ΠΎΡ‡ΠΊΠΎΠ². Подсказка для подписи - Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ я Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΠ» ΠΊΠΎΠ΄ ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это ошибка, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это Π½Π΅ удаСтся. И, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, это Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. Π― сСйчас сдСлаю ΠΏΠΈΠ°Ρ€ с ΡŽΠ½ΠΈΡ‚-тСстом.

Π²Ρ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ подсказку подписи конструктора?

Π’ΠΈΠ΄Π΅Ρ‚ΡŒ

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

Код Python с 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

ΠŸΠΎΡ‡Π΅ΠΌΡƒ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ подсказки подписи с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ?

НСваТно, я понял это ΠΈ исправил это. Π”ΠΎΠ±Π°Π²Π»ΡŽ Π² ΠΏΠΈΠ°Ρ€.

@enjoybeta Π― исправил это Π² PR, Π½ΠΎ ΡΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ подсказки подписи Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ выпускС.

@cmacdonald , Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ здСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

НичСго особСнного - Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ быстрый Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ класс Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ конструктор varargs?

Π’ любом случаС, я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ выпускС Jnius ошибка Π±ΡƒΠ΄Π΅Ρ‚ исправлСна.

ΠžΡ‚Π»ΠΈΡ‡Π½Π°Ρ идСя! Заводской ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± этом, Ссли ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄. Если Π½Π΅Ρ‚, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ слуТСбный класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сдСлаСт это Π·Π° Π½ΠΈΡ….

Богласны, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ этот вопрос сСйчас.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

Thrameos picture Thrameos  Β·  27ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

stania picture stania  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Hukuta picture Hukuta  Β·  5ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

ignertic picture ignertic  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

etc0de picture etc0de  Β·  5ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ