Browse Source

android: Changes to add compatibility with pyjnius/plyer

rdb 3 years ago
parent
commit
e02a9989fb

+ 4 - 1
direct/src/dist/commands.py

@@ -157,6 +157,9 @@ from android_log import write as android_log_write
 sys.frozen = True
 sys.frozen = True
 sys.platform = "android"
 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.
 # Replace stdout/stderr with something that writes to the Android log.
 class AndroidLogStream:
 class AndroidLogStream:
@@ -735,7 +738,7 @@ class build_apps(setuptools.Command):
 
 
         for appname in self.gui_apps:
         for appname in self.gui_apps:
             activity = ET.SubElement(application, 'activity')
             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:label', appname)
             activity.set('android:theme', '@android:style/Theme.NoTitleBar')
             activity.set('android:theme', '@android:style/Theme.NoTitleBar')
             activity.set('android:configChanges', 'orientation|keyboardHidden')
             activity.set('android:configChanges', 'orientation|keyboardHidden')

+ 3 - 0
makepanda/makepanda.py

@@ -6136,6 +6136,9 @@ if PkgSkip("PYTHON") == 0:
         PyTargetAdd('deploy-stubw.exe', input='deploy-stubw.obj')
         PyTargetAdd('deploy-stubw.exe', input='deploy-stubw.obj')
         PyTargetAdd('deploy-stubw.exe', opts=['MACOS_APP_BUNDLE', 'DEPLOYSTUB', 'NOICON'])
         PyTargetAdd('deploy-stubw.exe', opts=['MACOS_APP_BUNDLE', 'DEPLOYSTUB', 'NOICON'])
     elif GetTarget() == 'android':
     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_main.obj', opts=OPTS, input='android_main.cxx')
         PyTargetAdd('deploy-stubw_android_log.obj', opts=OPTS, input='android_log.c')
         PyTargetAdd('deploy-stubw_android_log.obj', opts=OPTS, input='android_log.c')
         PyTargetAdd('libdeploy-stubw.dll', input='android_native_app_glue.obj')
         PyTargetAdd('libdeploy-stubw.dll', input='android_native_app_glue.obj')

+ 8 - 2
panda/src/android/PythonActivity.java

@@ -16,8 +16,14 @@ package org.panda3d.android;
 import org.panda3d.android.PandaActivity;
 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 {
 public class PythonActivity extends PandaActivity {
+    // This is required by plyer.
+    public static PythonActivity mActivity;
+
+    public PythonActivity() {
+        mActivity = this;
+    }
 }
 }

+ 25 - 0
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);
+}