diff --git a/direct/src/dist/commands.py b/direct/src/dist/commands.py index 8441bfe93a..23e949ada6 100644 --- a/direct/src/dist/commands.py +++ b/direct/src/dist/commands.py @@ -157,6 +157,9 @@ from android_log import write as android_log_write sys.frozen = True sys.platform = "android" +# Temporary hack for plyer to detect Android, see kivy/plyer#670 +os.environ['ANDROID_ARGUMENT'] = '' + # Replace stdout/stderr with something that writes to the Android log. class AndroidLogStream: @@ -735,7 +738,7 @@ class build_apps(setuptools.Command): for appname in self.gui_apps: activity = ET.SubElement(application, 'activity') - activity.set('android:name', 'org.panda3d.android.PandaActivity') + activity.set('android:name', 'org.panda3d.android.PythonActivity') activity.set('android:label', appname) activity.set('android:theme', '@android:style/Theme.NoTitleBar') activity.set('android:configChanges', 'orientation|keyboardHidden') diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 849e085a15..83b0105bc8 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -6136,6 +6136,9 @@ if PkgSkip("PYTHON") == 0: PyTargetAdd('deploy-stubw.exe', input='deploy-stubw.obj') PyTargetAdd('deploy-stubw.exe', opts=['MACOS_APP_BUNDLE', 'DEPLOYSTUB', 'NOICON']) elif GetTarget() == 'android': + TargetAdd('org/jnius/NativeInvocationHandler.class', opts=OPTS, input='NativeInvocationHandler.java') + TargetAdd('classes.dex', input='org/jnius/NativeInvocationHandler.class') + PyTargetAdd('deploy-stubw_android_main.obj', opts=OPTS, input='android_main.cxx') PyTargetAdd('deploy-stubw_android_log.obj', opts=OPTS, input='android_log.c') PyTargetAdd('libdeploy-stubw.dll', input='android_native_app_glue.obj') diff --git a/panda/src/android/PythonActivity.java b/panda/src/android/PythonActivity.java index 0d282d84a5..731ed4d54c 100644 --- a/panda/src/android/PythonActivity.java +++ b/panda/src/android/PythonActivity.java @@ -16,8 +16,14 @@ package org.panda3d.android; import org.panda3d.android.PandaActivity; /** - * This is only declared as a separate class from PandaActivity so that we - * can have two separate activity definitions in ApplicationManifest.xml. + * Extends PandaActivity with some things that are useful in a Python + * application. */ public class PythonActivity extends PandaActivity { + // This is required by plyer. + public static PythonActivity mActivity; + + public PythonActivity() { + mActivity = this; + } } diff --git a/pandatool/src/deploy-stub/NativeInvocationHandler.java b/pandatool/src/deploy-stub/NativeInvocationHandler.java new file mode 100644 index 0000000000..2a10837328 --- /dev/null +++ b/pandatool/src/deploy-stub/NativeInvocationHandler.java @@ -0,0 +1,25 @@ +package org.jnius; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * Special support for pyjnius. + */ +public class NativeInvocationHandler implements InvocationHandler { + private long _ptr; + + public NativeInvocationHandler(long ptr) { + _ptr = ptr; + } + + public long getPythonObjectPointer() { + return _ptr; + } + + public Object invoke(Object proxy, Method method, Object[] args) { + return invoke0(proxy, method, args); + } + + native Object invoke0(Object proxy, Method method, Object[] args); +}