javapythonkivykivymdpyjnius

Java classes for pyjnius


I have created a Java class to use in python with pyjnius but I can't use it as pyjnius can't find it, the pyjnius documentation says that I have to move the Java classes to src/org And I have done it but have not been successful, could someone tell me how can I go about using my Java classes with pyjnius please.


Solution

  • Make sure you tell buildozer where is the java source that you package.

    for example, if you have java/org/test/TestClass.java you could do.

    android.add_src = java/
    

    make sure your java package matches what you expect to import from jnius.

    package org.test;
    
    from jnius import autoclass
    autoclass('org.test.TestClass')
    

    a full example

    app/main.py

    """Demonstrate loading custom java code using jnius
    """
    from kivy.app import App
    from jnius import autoclass
    
    
    class Application(App):
        """see module documentation
        """
    
        def test_jnius(self, name):
            """Lookup our test class, instanciate and call its method
            """
            cls = autoclass("org.test.TestClass")
            result = cls(name).get_result()
            self.root.ids.result_box.text = result
    
    
    if __name__ == "__main__":
        Application().run()
    

    app/application.kv

    FloatLayout:
        BoxLayout:
            orientation: 'vertical'
            size_hint: .5, .5
            pos_hint: {'center': (.5, .5)}
            spacing: '20dp'
    
            Label:
                text: 'Please enter your name'
    
            TextInput:
                id: ti
                multiline: False
                size_hint_y: None
                height: self.minimum_height
    
            Button:
                text: 'hit me!'
                on_release: app.test_jnius(ti.text)
                size_hint_y: None
                height: '38dp'
    
            Label:
                id: result_box
    

    buildozer.spec

    [app]
    title = Kivy With Java App
    package.name = kivyjavaapp
    package.domain = org.test
    source.dir = app/
    source.include_exts = py,png,jpg,kv,atlas
    version = 0.1
    requirements = python3,kivy
    orientation = portrait
    fullscreen = 0
    android.add_src = java/
    android.arch = armeabi-v7a
    android.allow_backup = True
    ios.kivy_ios_url = https://github.com/kivy/kivy-ios
    ios.kivy_ios_branch = master
    ios.ios_deploy_url = https://github.com/phonegap/ios-deploy
    ios.ios_deploy_branch = 1.10.0
    ios.codesign.allowed = false
    
    [buildozer]
    log_level = 2
    warn_on_root = 1
    

    java/org/test/TestClass.java

    package org.test;
    import java.lang.String;
    
    public class TestClass {
        private String _name;
    
        public TestClass(String name) {
            _name = name;
        }
    
        public String get_result() {
            return "Hello " + _name;
        }
    }
    

    (optional, if you want to test your java code on desktop, building it with ant all and export CLASSPATH=build/ before running python app/main.py)

    build.xml

    <project>
        <property name="ant.build.javac.source" value="1.7" />
        <property name="ant.build.javac.target" value="1.7" />
    
        <target name="clean">
          <delete dir="build"/>
        </target>
    
        <target name="test-compile">
            <mkdir dir="build"/>
            <javac srcdir="java/" destdir="build"
                   includeantruntime='false'
                   encoding="UTF-8"/>
        </target>
    
        <target name="jar" depends="test-compile">
            <jar destfile="build/org.test.jar" basedir="build/">
            </jar>
        </target>
    
        <target name="all" depends="jar,test-compile"/>
    </project>
    

    you can find this full example in this repository https://github.com/tshirtman/android_jnius_custom_java