mirror of https://github.com/kivy/pyjnius.git
140 lines
3.7 KiB
ReStructuredText
140 lines
3.7 KiB
ReStructuredText
.. _packaging:
|
|
|
|
Packaging
|
|
=========
|
|
|
|
For Packaging we use `PyInstaller <http://www.pyinstaller.org/>`_ and with
|
|
these simple steps we will create a simple executable containing PyJNIus
|
|
that prints the path of currently used Java. These steps assume you have
|
|
a supported version of Python for PyJNIus and PyInstaller available together
|
|
with Java installed (necessary for running the application).
|
|
|
|
main.py
|
|
-------
|
|
|
|
.. code:: python
|
|
|
|
from jnius import autoclass
|
|
|
|
if __name__ == '__main__':
|
|
print(autoclass('java.lang.System').getProperty('java.home'))
|
|
|
|
This will be our ``main.py`` file. You can now call PyInstaller to create
|
|
a basic ``.spec`` file which contains basic instructions for PyInstaller with::
|
|
|
|
pyinstaller main.py
|
|
|
|
main.spec
|
|
---------
|
|
|
|
The created ``.spec`` file might look like this::
|
|
|
|
# -*- mode: python -*-
|
|
|
|
block_cipher = None
|
|
|
|
|
|
a = Analysis(
|
|
['main.py'],
|
|
pathex=['<some path to main.py folder>'],
|
|
binaries=None,
|
|
datas=None,
|
|
hiddenimports=[],
|
|
hookspath=[],
|
|
runtime_hooks=[],
|
|
excludes=[],
|
|
win_no_prefer_redirects=False,
|
|
win_private_assemblies=False,
|
|
cipher=block_cipher
|
|
)
|
|
|
|
pyz = PYZ(
|
|
a.pure,
|
|
a.zipped_data,
|
|
cipher=block_cipher
|
|
)
|
|
|
|
exe = EXE(
|
|
pyz,
|
|
a.scripts,
|
|
exclude_binaries=True,
|
|
name='main',
|
|
debug=False,
|
|
strip=False,
|
|
upx=True,
|
|
console=True
|
|
)
|
|
|
|
coll = COLLECT(
|
|
exe,
|
|
a.binaries,
|
|
a.zipfiles,
|
|
a.datas,
|
|
strip=False,
|
|
upx=True,
|
|
name='main'
|
|
)
|
|
|
|
Notice the ``Analysis`` section, it contains details for what Python related
|
|
files to collect e.g. the ``main.py`` file. For PyJNIus to work you need to
|
|
include the ``jnius_config`` module to the ``hiddenimports`` list, otherwise
|
|
you will get a ``ImportError: No module named jnius_config``::
|
|
|
|
...
|
|
|
|
a = Analysis(
|
|
['main.py'],
|
|
pathex=['<some path to main.py folder>'],
|
|
binaries=None,
|
|
datas=None,
|
|
hiddenimports=['jnius_config'],
|
|
hookspath=[],
|
|
runtime_hooks=[],
|
|
excludes=[],
|
|
win_no_prefer_redirects=False,
|
|
win_private_assemblies=False,
|
|
cipher=block_cipher
|
|
)
|
|
|
|
...
|
|
|
|
After the ``.spec`` file is ready, in our case it's by default called by the
|
|
name of the ``.py`` file, we need to direct PyInstaller to use that file::
|
|
|
|
pyinstaller main.spec
|
|
|
|
This will create a folder with all required ``.dll`` and ``.pyd`` or ``.so``
|
|
shared libraries and other necessary files for our application and for Python
|
|
itself.
|
|
|
|
Running
|
|
-------
|
|
|
|
We have the application ready, but the "problem" is PyJNIus doesn't detect
|
|
any installed Java on your computer (yet). Therefore if you try to run the
|
|
application, it'll crash with a ``ImportError: DLL load failed: ...``.
|
|
For this simple example if you can see ``jnius.jnius.pyd`` or
|
|
``jnius.jnius.so`` in the final folder with ``main.exe`` (or just ``main``),
|
|
the error indicates that the application could not find Java Virtual Machine.
|
|
|
|
The Java Virtual Machine is in simple terms said another necessary shared
|
|
library your application needs to load (``jvm.dll`` or ``libjvm.so``).
|
|
|
|
On Windows this file might be in a folder similar to this::
|
|
|
|
C:\Program Files\Java\jdk1.7.0_79\jre\bin\server
|
|
|
|
and you need to include the folder to the system ``PATH`` environment variable
|
|
with this command::
|
|
|
|
set PATH=%PATH%;C:\\Program Files\\Java\\jdk1.7.0_79\\jre\\bin\\server
|
|
|
|
After the ``jvm.dll`` or ``libjvm.so`` becomes available, you can safely
|
|
try to run your application::
|
|
|
|
main.exe
|
|
|
|
and you should get an output similar to this::
|
|
|
|
C:\Program Files\Java\jdk1.7.0_79\jre
|