mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-06 06:20:55 -08:00
Update Android port
* INSTALL.android: Update. * build-aux/ndk-build-helper-1.mk: Fix typo. * configure.ac: Enable --with-json on Android. * cross/ndk-build/ndk-build-shared-library.mk: (NDK_CFLAGS_$(LOCAL_MODULE)): (LOCAL_MODULE_FILENAME): * cross/ndk-build/ndk-build-static-library.mk: (ALL_OBJECT_FILES$(LOCAL_MODULE)): (LOCAL_MODULE_FILENAME): Recursively resolve dependencies. * cross/ndk-build/ndk-resolve.mk: New function. * doc/emacs/android.texi (Android Startup): Document how Emacs is dumped during initial startup. * java/Makefile.in (filename): Fix build with multiple shared libraries. * java/README: Improve commentary. * java/org/gnu/emacs/EmacsApplication.java (onCreate): Look and set dump file. * java/org/gnu/emacs/EmacsNative.java (EmacsNative): New function getFingerprint. * java/org/gnu/emacs/EmacsPreferencesActivity.java (onCreate): Add option to erase the dump file. * java/org/gnu/emacs/EmacsService.java (browseUrl): New function. * java/org/gnu/emacs/EmacsThread.java (run): Specify dump file if found. * lisp/loadup.el: Always dump during loadup on Android. * lisp/net/browse-url.el (browse-url--browser-defcustom-type): (browse-url-default-browser): (browse-url-default-android-browser): New browse url type. * m4/ndk-build.m4 (ndk_package_map): Map jansson to libjansson. * src/android.c (struct android_emacs_service): New method `browse_url'. (getFingerprint): New function. (android_init_emacs_service): Initialize new method. (android_browse_url): New function. * src/android.h: Update prototypes. * src/androidselect.c (Fandroid_browse_url): New function. (syms_of_androidselect): Define it. * src/emacs.c (load_pdump): Don't look in fancy places on Android. * src/pdumper.c (Fdump_emacs_portable): Allow dumping while interactive on Android. (syms_of_pdumper): New variable `pdumper-fingerprint'. * src/sfntfont-android.c (sfntfont_android_composite_bitmap): Fix unused variables.
This commit is contained in:
parent
3267a2d6d2
commit
56e55a8008
23 changed files with 518 additions and 102 deletions
|
|
@ -148,6 +148,14 @@ work:
|
||||||
(You must add LOCAL_EXPORT_CFLAGS := -I$(LOCAL_PATH) before
|
(You must add LOCAL_EXPORT_CFLAGS := -I$(LOCAL_PATH) before
|
||||||
its Android.mk includes $(BUILD_STATIC_LIBRARY))
|
its Android.mk includes $(BUILD_STATIC_LIBRARY))
|
||||||
|
|
||||||
|
In addition, some Emacs dependencies provide `ndk-build' support
|
||||||
|
themselves:
|
||||||
|
|
||||||
|
libjansson - https://github.com/akheron/jansson
|
||||||
|
(You must add LOCAL_EXPORT_INCLUDES := $(LOCAL_C_INCLUDES) before
|
||||||
|
its Android.mk includes $(BUILD_SHARED_LIBRARY), then copy
|
||||||
|
android/jansson_config.h to android/jansson_private_config.h.)
|
||||||
|
|
||||||
We anticipate that most untested non-trivial ndk-build dependencies
|
We anticipate that most untested non-trivial ndk-build dependencies
|
||||||
will need adjustments in Emacs to work, as the Emacs build system
|
will need adjustments in Emacs to work, as the Emacs build system
|
||||||
which emulates ndk-build is in an extremely early state.
|
which emulates ndk-build is in an extremely early state.
|
||||||
|
|
@ -173,7 +181,7 @@ one awk script in build-awx, run during configure:
|
||||||
|
|
||||||
build-aux/ndk-module-extract.awk
|
build-aux/ndk-module-extract.awk
|
||||||
|
|
||||||
six Makefiles in cross/ndk-build,
|
seven Makefiles in cross/ndk-build,
|
||||||
|
|
||||||
cross/ndk-build/ndk-build-shared-library.mk
|
cross/ndk-build/ndk-build-shared-library.mk
|
||||||
cross/ndk-build/ndk-build-static-library.mk
|
cross/ndk-build/ndk-build-static-library.mk
|
||||||
|
|
@ -181,6 +189,7 @@ six Makefiles in cross/ndk-build,
|
||||||
cross/ndk-build/ndk-clear-vars.mk
|
cross/ndk-build/ndk-clear-vars.mk
|
||||||
cross/ndk-build/ndk-prebuilt-shared-library.mk
|
cross/ndk-build/ndk-prebuilt-shared-library.mk
|
||||||
cross/ndk-build/ndk-prebuilt-static-library.mk
|
cross/ndk-build/ndk-prebuilt-static-library.mk
|
||||||
|
cross/ndk-build/ndk-resolve.mk
|
||||||
|
|
||||||
and finally, two more Makefiles in cross/ndk-build, generated by
|
and finally, two more Makefiles in cross/ndk-build, generated by
|
||||||
configure:
|
configure:
|
||||||
|
|
@ -373,11 +382,27 @@ them. The name under which the module is linked is the same as the
|
||||||
Make target found on the sixth line of output from
|
Make target found on the sixth line of output from
|
||||||
build-aux/ndk-build-helper.mk.
|
build-aux/ndk-build-helper.mk.
|
||||||
|
|
||||||
However, none of the Makefiles in
|
While the rules defined by the Makefiles in cross/ndk-build do not
|
||||||
cross/ndk-build/ndk-build-shared-library.mk perform any kind of
|
have their dependencies as prerequisites (with the assumption that the
|
||||||
dependency resolution! Instead, they only define rules to build
|
ndk-build.m4 and the Makefiles in build-aux have already added all of
|
||||||
individual modules, leaving dependency resolution up to the Makefiles
|
the necessary targets to ndk-build.mk), dependency resolution is still
|
||||||
in the `build-aux' directory.
|
performed, as the CFLAGS and includes from dependencies must be
|
||||||
|
appended to the module's CFLAGS.
|
||||||
|
|
||||||
|
This is done by including cross/ndk-build/ndk-resolve.mk each time a
|
||||||
|
shared or static library module is going to be built. How is this
|
||||||
|
done?
|
||||||
|
|
||||||
|
First, ndk-resolve.mk saves the LOCAL_PATH, LOCAL_STATIC_LIBRARIES,
|
||||||
|
LOCAL_SHARED_LIBRARIES, LOCAL_EXPORT_CFLAGS and
|
||||||
|
LOCAL_EXPORT_C_INCLUDES from the module.
|
||||||
|
|
||||||
|
Next, ndk-resolve loops through the dependencies the module has
|
||||||
|
specified, appending its CFLAGS and includes to the command line for
|
||||||
|
the current module.
|
||||||
|
|
||||||
|
Then, that process is repeated for each such dependency which has not
|
||||||
|
already been resolved, until all dependencies have been resolved.
|
||||||
|
|
||||||
libpng is a very simple module, providing only a single shared object
|
libpng is a very simple module, providing only a single shared object
|
||||||
module. This module is named libpng_emacs.so and is eventually built
|
module. This module is named libpng_emacs.so and is eventually built
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ NDK_$(LOCAL_MODULE)_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES)
|
||||||
|
|
||||||
$(info Building $(build_kind))
|
$(info Building $(build_kind))
|
||||||
$(info $(LOCAL_MODULE))
|
$(info $(LOCAL_MODULE))
|
||||||
$(info $(addprefix $(ANDROID_MODULE_DIRECTORY)?,$(LOCAL_SRC_FILES) $(LOCAL_SRC_FILES$(EMACS_ABI))))
|
$(info $(addprefix $(ANDROID_MODULE_DIRECTORY)/,$(LOCAL_SRC_FILES) $(LOCAL_SRC_FILES$(EMACS_ABI))))
|
||||||
|
|
||||||
$(info $(foreach dir,$(LOCAL_EXPORT_C_INCLUDE_DIRS) $(LOCAL_EXPORT_C_INCLUDES),-I$(dir)))
|
$(info $(foreach dir,$(LOCAL_EXPORT_C_INCLUDE_DIRS) $(LOCAL_EXPORT_C_INCLUDES),-I$(dir)))
|
||||||
$(info $(LOCAL_EXPORT_CFLAGS))
|
$(info $(LOCAL_EXPORT_CFLAGS))
|
||||||
|
|
|
||||||
|
|
@ -1045,6 +1045,7 @@ package will likely install on older systems but crash on startup.])
|
||||||
passthrough="$passthrough --with-png=$with_png"
|
passthrough="$passthrough --with-png=$with_png"
|
||||||
passthrough="$passthrough --with-webp=$with_webp"
|
passthrough="$passthrough --with-webp=$with_webp"
|
||||||
passthrough="$passthrough --with-gif=$with_gif"
|
passthrough="$passthrough --with-gif=$with_gif"
|
||||||
|
passthrough="$passthrough --with-json=$with_json"
|
||||||
|
|
||||||
AS_IF([XCONFIGURE=android ANDROID_CC="$ANDROID_CC" \
|
AS_IF([XCONFIGURE=android ANDROID_CC="$ANDROID_CC" \
|
||||||
ANDROID_SDK="$android_sdk" android_abi=$android_abi \
|
ANDROID_SDK="$android_sdk" android_abi=$android_abi \
|
||||||
|
|
@ -1112,6 +1113,7 @@ if test "$ANDROID" = "yes"; then
|
||||||
with_png=no
|
with_png=no
|
||||||
with_webp=no
|
with_webp=no
|
||||||
with_gif=no
|
with_gif=no
|
||||||
|
with_json=no
|
||||||
fi
|
fi
|
||||||
|
|
||||||
with_xml2=no
|
with_xml2=no
|
||||||
|
|
@ -1121,7 +1123,6 @@ if test "$ANDROID" = "yes"; then
|
||||||
with_libsystemd=no
|
with_libsystemd=no
|
||||||
with_cairo=no
|
with_cairo=no
|
||||||
with_imagemagick=no
|
with_imagemagick=no
|
||||||
with_json=no
|
|
||||||
with_tree_sitter=no
|
with_tree_sitter=no
|
||||||
with_xft=no
|
with_xft=no
|
||||||
with_harfbuzz=no
|
with_harfbuzz=no
|
||||||
|
|
|
||||||
|
|
@ -44,11 +44,13 @@ ALL_OBJECT_FILES$(LOCAL_MODULE) += $(call objname,$(LOCAL_MODULE),$(basename $(1
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
NDK_CFLAGS_$(LOCAL_MODULE) := $(addprefix -I,$(addprefix $(LOCAL_PATH),$(LOCAL_C_INCLUDES)))
|
# Make sure to not add a prefix to local includes that already specify
|
||||||
NDK_CFLAGS_$(LOCAL_MODULE) ::= -fPIC -iquote $(LOCAL_EXPORT_CFLAGS) $(LOCAL_PATH) $(LOCAL_CFLAGS)
|
# $(LOCAL_PATH).
|
||||||
NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDLIBS)
|
NDK_CFLAGS_$(LOCAL_MODULE) := $(addprefix -I,$(LOCAL_C_INCLUDES))
|
||||||
NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDFLAGS)
|
NDK_CFLAGS_$(LOCAL_MODULE) += -fPIC -iquote $(LOCAL_PATH) $(LOCAL_EXPORT_CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_CFLAGS$(NDK_BUILD_ARCH))
|
||||||
ALL_OBJECT_FILES_$(LOCAL_MODULE) :=
|
NDK_ASFLAGS_$(LOCAL_MODULE) := $(LOCAL_ASFLAGS) $(LOCAL_ASFLAGS_$(NDK_BUILD_ARCH))
|
||||||
|
NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDLIBS) $(LOCAL_LDFLAGS)
|
||||||
|
ALL_OBJECT_FILES$(LOCAL_MODULE) :=
|
||||||
|
|
||||||
ifeq ($(NDK_BUILD_ARCH)$(NDK_ARM_MODE),armarm)
|
ifeq ($(NDK_BUILD_ARCH)$(NDK_ARM_MODE),armarm)
|
||||||
NDK_CFLAGS ::= -marm
|
NDK_CFLAGS ::= -marm
|
||||||
|
|
@ -74,8 +76,17 @@ endif
|
||||||
|
|
||||||
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE_FILENAME).so
|
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE_FILENAME).so
|
||||||
|
|
||||||
|
# Record this module's dependencies and exported includes and CFLAGS,
|
||||||
|
# and then add that of its dependencies.
|
||||||
|
|
||||||
|
include ndk-resolve.mk
|
||||||
|
|
||||||
# Then define rules to build all objects.
|
# Then define rules to build all objects.
|
||||||
ALL_SOURCE_FILES = $(LOCAL_SRC_FILES)
|
ALL_SOURCE_FILES = $(LOCAL_SRC_FILES) $(LOCAL_SRC_FILES_$(NDK_BUILD_ARCH))
|
||||||
|
|
||||||
|
# This defines all dependencies.
|
||||||
|
ALL_OBJECT_FILES$(LOCAL_MODULE) =
|
||||||
|
|
||||||
$(foreach source,$(ALL_SOURCE_FILES),$(eval $(call single-object-target,$(source))))
|
$(foreach source,$(ALL_SOURCE_FILES),$(eval $(call single-object-target,$(source))))
|
||||||
|
|
||||||
# Now define the rule to build the shared library.
|
# Now define the rule to build the shared library.
|
||||||
|
|
|
||||||
|
|
@ -43,11 +43,10 @@ endif
|
||||||
ALL_OBJECT_FILES$(LOCAL_MODULE) += $(call objname,$(LOCAL_MODULE),$(basename $(1)))
|
ALL_OBJECT_FILES$(LOCAL_MODULE) += $(call objname,$(LOCAL_MODULE),$(basename $(1)))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
NDK_CFLAGS_$(LOCAL_MODULE) := $(addprefix -I,$(addprefix $(LOCAL_PATH),$(LOCAL_C_INCLUDES)))
|
NDK_CFLAGS_$(LOCAL_MODULE) := $(addprefix -I,$(LOCAL_C_INCLUDES))
|
||||||
NDK_CFLAGS_$(LOCAL_MODULE) ::= -iquote $(LOCAL_PATH) $(LOCAL_EXPORT_CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_CFLAGS_$(NDK_BUILD_ARCH))
|
NDK_CFLAGS_$(LOCAL_MODULE) += -iquote $(LOCAL_PATH) $(LOCAL_EXPORT_CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_CFLAGS_$(NDK_BUILD_ARCH))
|
||||||
NDK_ASFLAGS_$(LOCAL_MODULE) ::= $(LOCAL_ASFLAGS) $(LOCAL_ASFLAGS_$(NDK_BUILD_ARCH))
|
NDK_ASFLAGS_$(LOCAL_MODULE) := $(LOCAL_ASFLAGS) $(LOCAL_ASFLAGS_$(NDK_BUILD_ARCH))
|
||||||
NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDLIBS)
|
NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDLIBS) $(LOCAL_LDFLAGS)
|
||||||
NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDFLAGS)
|
|
||||||
ALL_OBJECT_FILES$(LOCAL_MODULE) :=
|
ALL_OBJECT_FILES$(LOCAL_MODULE) :=
|
||||||
|
|
||||||
ifeq ($(NDK_BUILD_ARCH)$(NDK_ARM_MODE),armarm)
|
ifeq ($(NDK_BUILD_ARCH)$(NDK_ARM_MODE),armarm)
|
||||||
|
|
@ -70,6 +69,11 @@ endif
|
||||||
|
|
||||||
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE_FILENAME).a
|
LOCAL_MODULE_FILENAME := $(LOCAL_MODULE_FILENAME).a
|
||||||
|
|
||||||
|
# Record this module's dependencies and exported includes and CFLAGS,
|
||||||
|
# and then add that of its dependencies.
|
||||||
|
|
||||||
|
include ndk-resolve.mk
|
||||||
|
|
||||||
# Then define rules to build all objects.
|
# Then define rules to build all objects.
|
||||||
ALL_SOURCE_FILES = $(LOCAL_SRC_FILES) $(LOCAL_SRC_FILES_$(NDK_BUILD_ARCH))
|
ALL_SOURCE_FILES = $(LOCAL_SRC_FILES) $(LOCAL_SRC_FILES_$(NDK_BUILD_ARCH))
|
||||||
|
|
||||||
|
|
|
||||||
47
cross/ndk-build/ndk-resolve.mk
Normal file
47
cross/ndk-build/ndk-resolve.mk
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
# Copyright 2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This file is part of GNU Emacs.
|
||||||
|
|
||||||
|
# GNU Emacs is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# GNU Emacs is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# ndk-build works by including a bunch of Makefiles which set
|
||||||
|
# variables, and then having those Makefiles include another makefile
|
||||||
|
# which actually builds targets.
|
||||||
|
|
||||||
|
# Save information.
|
||||||
|
NDK_LOCAL_PATH_$(LOCAL_MODULE) := $(LOCAL_PATH)
|
||||||
|
NDK_LOCAL_STATIC_LIBRARIES_$(LOCAL_MODULE) := $(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES)
|
||||||
|
NDK_LOCAL_SHARED_LIBRARIES_$(LOCAL_MODULE) := $(LOCAL_SHARED_LIBRARIES)
|
||||||
|
NDK_LOCAL_EXPORT_CFLAGS_$(LOCAL_MODULE) := $(LOCAL_EXPORT_CFLAGS)
|
||||||
|
NDK_LOCAL_EXPORT_C_INCLUDES_$(LOCAL_MODULE) := $(LOCAL_EXPORT_C_INCLUDES)
|
||||||
|
|
||||||
|
# List of all dependencies resolved for this module thus far.
|
||||||
|
# Used to avoid infinite recursion.
|
||||||
|
NDK_RESOLVED_$(LOCAL_MODULE) :=
|
||||||
|
|
||||||
|
define ndk-resolve
|
||||||
|
|
||||||
|
ifeq ($(patsubst $(1),,$(NDK_RESOLVED$(LOCAL_MODULE))),$(NDK_RESOLVED$(LOCAL_MODULE)))
|
||||||
|
NDK_RESOLVED$(LOCAL_MODULE) += $(1)
|
||||||
|
NDK_CFLAGS_$(LOCAL_MODULE) += $(NDK_LOCAL_EXPORT_CFLAGS_$(1))
|
||||||
|
NDK_CFLAGS_$(LOCAL_MODULE) += $(addprefix -I,$(NDK_LOCAL_EXPORT_C_INCLUDES_$(1)))
|
||||||
|
|
||||||
|
$$(foreach module,$$(NDK_LOCAL_STATIC_LIBRARIES_$(1)),$$(eval $$(call ndk-resolve,$$(module))))
|
||||||
|
$$(foreach module,$$(NDK_LOCAL_SHARED_LIBRARIES_$(1)),$$(eval $$(call ndk-resolve,$$(module))))
|
||||||
|
endif
|
||||||
|
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(foreach module,$(LOCAL_SHARED_LIBRARIES),$(eval $(call ndk-resolve,$(module))))
|
||||||
|
$(foreach module,$(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES),$(eval $(call ndk-resolve,$(module))))
|
||||||
|
|
@ -69,10 +69,10 @@ application icon is clicked.
|
||||||
|
|
||||||
@cindex ``adb logcat''
|
@cindex ``adb logcat''
|
||||||
|
|
||||||
During startup, Emacs will display messages in the system log buffer;
|
During startup, Emacs will display messages in the system log
|
||||||
reading that buffer requires the Android Debug Bridge (@code{adb})
|
buffer; reading that buffer requires the Android Debug Bridge
|
||||||
utility to be installed on another computer; it cannot be read on the
|
(@code{adb}) utility to be installed on another computer; it cannot be
|
||||||
computer running Android itself.
|
read on the computer running Android itself.
|
||||||
|
|
||||||
After enabling the ``USB Debugging'' feature on the Android system,
|
After enabling the ``USB Debugging'' feature on the Android system,
|
||||||
and connecting it via USB to another system with the @code{adb}
|
and connecting it via USB to another system with the @code{adb}
|
||||||
|
|
@ -84,14 +84,31 @@ $ adb logcat | grep -E "(android_run_debug_thread|[Ee]macs)"
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@cindex emacs -Q, android
|
@cindex emacs -Q, android
|
||||||
Since Android has no command line, there is normally no way to specify
|
Since Android has no command line, there is normally no way to
|
||||||
command-line arguments. However, Emacs can be started with the
|
specify command-line arguments when starting Emacs. However, Emacs
|
||||||
equivalent of the @code{--quick} option (@pxref{Initial Options})
|
can be started with the equivalent of the @code{--quick} option
|
||||||
through a special preferences screen, which can be accessed through
|
(@pxref{Initial Options}) through a special preferences screen, which
|
||||||
the Emacs ``app info'' page in the system settings application.
|
can be accessed through the Emacs ``app info'' page in the system
|
||||||
|
settings application.
|
||||||
|
|
||||||
Consult the manufacturer of your device for more details, as how to do
|
Consult the manufacturer of your device for more details, as how to
|
||||||
this varies by device.
|
do this varies by device.
|
||||||
|
|
||||||
|
@cindex dumping, android
|
||||||
|
The first time any given copy of Emacs starts on a device, it spends
|
||||||
|
a while loading the preloaded Lisp files which normally come with
|
||||||
|
Emacs. This produces a ``dump file'' (@pxref{Initial Options}) in the
|
||||||
|
files directory, containing an identifier unique to this copy of
|
||||||
|
Emacs.
|
||||||
|
|
||||||
|
The next time that same copy of Emacs starts up, it simply loads the
|
||||||
|
preloaded Lisp files contained in that dump file, greatly improving
|
||||||
|
start up time.
|
||||||
|
|
||||||
|
However, if by some unforseen circumstance the dump file is
|
||||||
|
corrupted, Emacs can crash. If that happens, the dump file stored in
|
||||||
|
the Emacs files directory can be erased through the same preferences
|
||||||
|
screen.
|
||||||
|
|
||||||
@node Android File System
|
@node Android File System
|
||||||
@section What files Emacs can access under Android
|
@section What files Emacs can access under Android
|
||||||
|
|
|
||||||
|
|
@ -148,8 +148,7 @@ emacs.apk-in: $(CROSS_BINS) $(CROSS_LIBS) $(libsrc)/asset-directory-tool \
|
||||||
cp -f $$file install_temp/lib/$(ANDROID_ABI); \
|
cp -f $$file install_temp/lib/$(ANDROID_ABI); \
|
||||||
fi \
|
fi \
|
||||||
done
|
done
|
||||||
$(foreach module,$(NDK_BUILD_SHARED), \
|
cp -f $(NDK_BUILD_SHARED) install_temp/lib/$(ANDROID_ABI)
|
||||||
cp -f $(module) install_temp/lib/$(ANDROID_ABI))
|
|
||||||
# Package everything. Specifying the assets on this command line is
|
# Package everything. Specifying the assets on this command line is
|
||||||
# necessary for AAssetManager_getNextFileName to work on old versions
|
# necessary for AAssetManager_getNextFileName to work on old versions
|
||||||
# of Android.
|
# of Android.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
This directory holds the Java sources of the port of GNU Emacs to
|
This directory holds the Java sources of the port of GNU Emacs to
|
||||||
Android-like systems.
|
Android-like systems, along with files needed to create an application
|
||||||
|
package out of them.
|
||||||
|
|
||||||
|
`emacs.keystore' is the signing key used to build Emacs. It is kept
|
||||||
|
here, and we encourage all people redistributing Emacs to use this
|
||||||
|
key. It holds no security value, and otherwise it will be impossible
|
||||||
|
to install different builds of Emacs on top of each other.
|
||||||
|
|
||||||
Please keep the Java code indented with tabs and formatted according
|
Please keep the Java code indented with tabs and formatted according
|
||||||
to the rules for C code in the GNU coding standards. Always use
|
to the rules for C code in the GNU coding standards. Always use
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,59 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
package org.gnu.emacs;
|
package org.gnu.emacs;
|
||||||
|
|
||||||
import android.app.Application;
|
import java.io.File;
|
||||||
|
import java.io.FileFilter;
|
||||||
|
|
||||||
public class EmacsApplication extends Application
|
import android.app.Application;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class EmacsApplication extends Application implements FileFilter
|
||||||
{
|
{
|
||||||
/* This class currently does nothing. */
|
private static final String TAG = "EmacsApplication";
|
||||||
|
|
||||||
|
/* The name of the dump file to use. */
|
||||||
|
public static String dumpFileName;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean
|
||||||
|
accept (File file)
|
||||||
|
{
|
||||||
|
return (!file.isDirectory ()
|
||||||
|
&& file.getName ().endsWith (".pdmp"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void
|
||||||
|
onCreate ()
|
||||||
|
{
|
||||||
|
File filesDirectory;
|
||||||
|
File[] allFiles;
|
||||||
|
String wantedDumpFile;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
wantedDumpFile = ("emacs-" + EmacsNative.getFingerprint ()
|
||||||
|
+ ".pdmp");
|
||||||
|
|
||||||
|
Log.d (TAG, "onCreate: looking for " + wantedDumpFile);
|
||||||
|
|
||||||
|
/* Obtain a list of all files ending with ``.pdmp''. Then, look
|
||||||
|
for a file named ``emacs-<fingerprint>.pdmp'' and delete the
|
||||||
|
rest. */
|
||||||
|
filesDirectory = getFilesDir ();
|
||||||
|
allFiles = filesDirectory.listFiles (this);
|
||||||
|
|
||||||
|
/* Now try to find the right dump file. */
|
||||||
|
for (i = 0; i < allFiles.length; ++i)
|
||||||
|
{
|
||||||
|
if (allFiles[i].getName ().equals (wantedDumpFile))
|
||||||
|
dumpFileName = allFiles[i].getAbsolutePath ();
|
||||||
|
else
|
||||||
|
/* Delete this outdated dump file. */
|
||||||
|
allFiles[i].delete ();
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d (TAG, "onCreate: found " + dumpFileName);
|
||||||
|
|
||||||
|
super.onCreate ();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ import android.content.res.AssetManager;
|
||||||
|
|
||||||
public class EmacsNative
|
public class EmacsNative
|
||||||
{
|
{
|
||||||
|
/* Obtain the fingerprint of this build of Emacs. The fingerprint
|
||||||
|
can be used to determine the dump file name. */
|
||||||
|
public static native String getFingerprint ();
|
||||||
|
|
||||||
/* Set certain parameters before initializing Emacs. This proves
|
/* Set certain parameters before initializing Emacs. This proves
|
||||||
that libemacs.so is being loaded from Java code.
|
that libemacs.so is being loaded from Java code.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
package org.gnu.emacs;
|
package org.gnu.emacs;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
@ -93,6 +95,31 @@ public class EmacsPreferencesActivity extends Activity
|
||||||
});
|
});
|
||||||
layout.addView (textView);
|
layout.addView (textView);
|
||||||
|
|
||||||
|
textView = new TextView (this);
|
||||||
|
textView.setPadding (8, 20, 20, 8);
|
||||||
|
|
||||||
|
params = new LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT,
|
||||||
|
LayoutParams.WRAP_CONTENT);
|
||||||
|
textView.setLayoutParams (params);
|
||||||
|
textView.setText ("Erase dump file");
|
||||||
|
textView.setOnClickListener (new View.OnClickListener () {
|
||||||
|
@Override
|
||||||
|
public void
|
||||||
|
onClick (View view)
|
||||||
|
{
|
||||||
|
String wantedDumpFile;
|
||||||
|
File file;
|
||||||
|
|
||||||
|
wantedDumpFile = ("emacs-" + EmacsNative.getFingerprint ()
|
||||||
|
+ ".pdmp");
|
||||||
|
file = new File (getFilesDir (), wantedDumpFile);
|
||||||
|
|
||||||
|
if (file.exists ())
|
||||||
|
file.delete ();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
layout.addView (textView);
|
||||||
|
|
||||||
super.onCreate (savedInstanceState);
|
super.onCreate (savedInstanceState);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,8 @@ import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
|
@ -504,4 +506,27 @@ public class EmacsService extends Service
|
||||||
EmacsService.class));
|
EmacsService.class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Ask the system to open the specified URL.
|
||||||
|
Value is NULL upon success, or a string describing the error
|
||||||
|
upon failure. */
|
||||||
|
|
||||||
|
public String
|
||||||
|
browseUrl (String url)
|
||||||
|
{
|
||||||
|
Intent intent;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
intent = new Intent (Intent.ACTION_VIEW, Uri.parse (url));
|
||||||
|
intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
startActivity (intent);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return e.toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -38,10 +38,23 @@ public class EmacsThread extends Thread
|
||||||
{
|
{
|
||||||
String args[];
|
String args[];
|
||||||
|
|
||||||
|
if (EmacsApplication.dumpFileName == null)
|
||||||
|
{
|
||||||
if (!startDashQ)
|
if (!startDashQ)
|
||||||
args = new String[] { "libandroid-emacs.so", };
|
args = new String[] { "libandroid-emacs.so", };
|
||||||
else
|
else
|
||||||
args = new String[] { "libandroid-emacs.so", "-Q", };
|
args = new String[] { "libandroid-emacs.so", "-Q", };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!startDashQ)
|
||||||
|
args = new String[] { "libandroid-emacs.so", "--dump-file",
|
||||||
|
EmacsApplication.dumpFileName, };
|
||||||
|
else
|
||||||
|
args = new String[] { "libandroid-emacs.so", "-Q",
|
||||||
|
"--dump-file",
|
||||||
|
EmacsApplication.dumpFileName, };
|
||||||
|
}
|
||||||
|
|
||||||
/* Run the native code now. */
|
/* Run the native code now. */
|
||||||
EmacsNative.initEmacs (args);
|
EmacsNative.initEmacs (args);
|
||||||
|
|
|
||||||
|
|
@ -550,6 +550,32 @@ lost after dumping")))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(if (eq system-type 'android)
|
||||||
|
(progn
|
||||||
|
;; Dumping Emacs on Android works slightly differently from
|
||||||
|
;; everywhere else. The first time Emacs starts, Emacs dumps
|
||||||
|
;; itself to "emacs-%s.pdump", and then proceeds with loadup,
|
||||||
|
;; where %s is replaced by the dump fingerprint.
|
||||||
|
;; EmacsApplication.java removes any pdump files with a
|
||||||
|
;; different build fingerprint upon being created, which happens
|
||||||
|
;; the moment the Android system starts Emacs. Then, it passes
|
||||||
|
;; the appropriate "--dump-file" to libemacs.so as it starts.
|
||||||
|
(let ((temp-dir (getenv "TEMP"))
|
||||||
|
(dump-file-name (format "%semacs-%s.pdmp"
|
||||||
|
(file-name-as-directory "~")
|
||||||
|
pdumper-fingerprint))
|
||||||
|
(dump-temp-file-name (format "%s~emacs-%s.pdmp"
|
||||||
|
(file-name-as-directory "~")
|
||||||
|
pdumper-fingerprint)))
|
||||||
|
(unless (pdumper-stats)
|
||||||
|
(condition-case ()
|
||||||
|
(progn
|
||||||
|
(dump-emacs-portable dump-temp-file-name)
|
||||||
|
;; Move the dumped file to the actual dump file name.
|
||||||
|
(rename-file dump-temp-file-name dump-file-name)
|
||||||
|
;; Continue with loadup.
|
||||||
|
nil)
|
||||||
|
(error nil)))))
|
||||||
(if dump-mode
|
(if dump-mode
|
||||||
(let ((output (cond ((equal dump-mode "pdump") "emacs.pdmp")
|
(let ((output (cond ((equal dump-mode "pdump") "emacs.pdmp")
|
||||||
((equal dump-mode "dump") "emacs")
|
((equal dump-mode "dump") "emacs")
|
||||||
|
|
@ -585,6 +611,10 @@ lost after dumping")))
|
||||||
;; Recompute NAME now, so that it isn't set when we dump.
|
;; Recompute NAME now, so that it isn't set when we dump.
|
||||||
(if (not (or (eq system-type 'ms-dos)
|
(if (not (or (eq system-type 'ms-dos)
|
||||||
(eq system-type 'haiku) ;; BFS doesn't support hard links
|
(eq system-type 'haiku) ;; BFS doesn't support hard links
|
||||||
|
;; There's no point keeping old dumps around for
|
||||||
|
;; the binary used to build Lisp on the build
|
||||||
|
;; machine.
|
||||||
|
(featurep 'android)
|
||||||
;; Don't bother adding another name if we're just
|
;; Don't bother adding another name if we're just
|
||||||
;; building bootstrap-emacs.
|
;; building bootstrap-emacs.
|
||||||
(member dump-mode '("pbootstrap" "bootstrap"))))
|
(member dump-mode '("pbootstrap" "bootstrap"))))
|
||||||
|
|
@ -609,7 +639,7 @@ lost after dumping")))
|
||||||
(expand-file-name (concat name ".pdmp")
|
(expand-file-name (concat name ".pdmp")
|
||||||
invocation-directory)
|
invocation-directory)
|
||||||
t))))
|
t))))
|
||||||
(kill-emacs)))
|
(kill-emacs))))
|
||||||
|
|
||||||
;; This file must be loaded each time Emacs is run from scratch, e.g., temacs.
|
;; This file must be loaded each time Emacs is run from scratch, e.g., temacs.
|
||||||
;; So run the startup code now. First, remove `-l loadup' from args.
|
;; So run the startup code now. First, remove `-l loadup' from args.
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@
|
||||||
;; browse-url-xdg-open freedesktop.org xdg-open
|
;; browse-url-xdg-open freedesktop.org xdg-open
|
||||||
;; browse-url-kde KDE konqueror (kfm)
|
;; browse-url-kde KDE konqueror (kfm)
|
||||||
;; browse-url-elinks Elinks Don't know (tried with 0.12.GIT)
|
;; browse-url-elinks Elinks Don't know (tried with 0.12.GIT)
|
||||||
|
;; browse-url-default-android-browser Android 2.3.3 (should work on 2.2 too)
|
||||||
;; eww-browse-url Emacs Web Wowser
|
;; eww-browse-url Emacs Web Wowser
|
||||||
|
|
||||||
;; Browsers can cache web pages so it may be necessary to tell them to
|
;; Browsers can cache web pages so it may be necessary to tell them to
|
||||||
|
|
@ -173,6 +174,9 @@
|
||||||
,@(when (eq system-type 'darwin)
|
,@(when (eq system-type 'darwin)
|
||||||
(list '(function-item :tag "Default macOS browser"
|
(list '(function-item :tag "Default macOS browser"
|
||||||
:value browse-url-default-macosx-browser)))
|
:value browse-url-default-macosx-browser)))
|
||||||
|
,@(when (eq system-type 'android)
|
||||||
|
(list '(function-item :tag "Default Android browser"
|
||||||
|
:value browse-url-default-android-browser)))
|
||||||
(function-item :tag "Default browser"
|
(function-item :tag "Default browser"
|
||||||
:value browse-url-default-browser)
|
:value browse-url-default-browser)
|
||||||
(function :tag "Your own function")
|
(function :tag "Your own function")
|
||||||
|
|
@ -1057,6 +1061,8 @@ instead of `browse-url-new-window-flag'."
|
||||||
'browse-url-default-macosx-browser)
|
'browse-url-default-macosx-browser)
|
||||||
((featurep 'haiku)
|
((featurep 'haiku)
|
||||||
'browse-url-default-haiku-browser)
|
'browse-url-default-haiku-browser)
|
||||||
|
((eq system-type 'android)
|
||||||
|
'browse-url-default-android-browser)
|
||||||
((browse-url-can-use-xdg-open) 'browse-url-xdg-open)
|
((browse-url-can-use-xdg-open) 'browse-url-xdg-open)
|
||||||
;;; ((executable-find browse-url-gnome-moz-program) 'browse-url-gnome-moz)
|
;;; ((executable-find browse-url-gnome-moz-program) 'browse-url-gnome-moz)
|
||||||
((executable-find browse-url-firefox-program) 'browse-url-firefox)
|
((executable-find browse-url-firefox-program) 'browse-url-firefox)
|
||||||
|
|
@ -1294,6 +1300,22 @@ Default to the URL around or before point."
|
||||||
(function-put 'browse-url-default-haiku-browser
|
(function-put 'browse-url-default-haiku-browser
|
||||||
'browse-url-browser-kind 'external)
|
'browse-url-browser-kind 'external)
|
||||||
|
|
||||||
|
(declare-function android-browse-url "androidselect.c")
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun browse-url-default-android-browser (url &optional _new-window)
|
||||||
|
"Browse URL with the system default browser.
|
||||||
|
Default to the URL around or before point."
|
||||||
|
(interactive (browse-url-interactive-arg "URL: "))
|
||||||
|
(setq url (browse-url-encode-url url))
|
||||||
|
;; Make sure the URL starts with an appropriate scheme.
|
||||||
|
(unless (string-match "\\(.+\\):/" url)
|
||||||
|
(setq url (concat "http://" url)))
|
||||||
|
(android-browse-url url))
|
||||||
|
|
||||||
|
(function-put 'browse-url-default-android-browser
|
||||||
|
'browse-url-browser-kind 'external)
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(defun browse-url-emacs (url &optional same-window)
|
(defun browse-url-emacs (url &optional same-window)
|
||||||
"Ask Emacs to load URL into a buffer and show it in another window.
|
"Ask Emacs to load URL into a buffer and show it in another window.
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ esac
|
||||||
# This is a map between pkg-config style package names and Android
|
# This is a map between pkg-config style package names and Android
|
||||||
# ones.
|
# ones.
|
||||||
|
|
||||||
ndk_package_map="libwebpdemux:webpdemux libxml-2.0:libxml2"
|
ndk_package_map="libwebpdemux:webpdemux libxml-2.0:libxml2 jansson:libjansson"
|
||||||
|
|
||||||
# Replace ndk_module with the appropriate Android module name if it is
|
# Replace ndk_module with the appropriate Android module name if it is
|
||||||
# found in ndk_package_map.
|
# found in ndk_package_map.
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <fingerprint.h>
|
||||||
|
|
||||||
#include "android.h"
|
#include "android.h"
|
||||||
#include "androidgui.h"
|
#include "androidgui.h"
|
||||||
|
|
@ -95,6 +96,7 @@ struct android_emacs_service
|
||||||
jmethodID detect_mouse;
|
jmethodID detect_mouse;
|
||||||
jmethodID name_keysym;
|
jmethodID name_keysym;
|
||||||
jmethodID sync;
|
jmethodID sync;
|
||||||
|
jmethodID browse_url;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct android_emacs_pixmap
|
struct android_emacs_pixmap
|
||||||
|
|
@ -1294,6 +1296,18 @@ android_get_home_directory (void)
|
||||||
#pragma GCC diagnostic ignored "-Wmissing-prototypes"
|
#pragma GCC diagnostic ignored "-Wmissing-prototypes"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL
|
||||||
|
NATIVE_NAME (getFingerprint) (JNIEnv *env, jobject object)
|
||||||
|
{
|
||||||
|
char buffer[sizeof fingerprint * 2 + 1];
|
||||||
|
|
||||||
|
memset (buffer, 0, sizeof buffer);
|
||||||
|
hexbuf_digest (buffer, (char *) fingerprint,
|
||||||
|
sizeof fingerprint);
|
||||||
|
|
||||||
|
return (*env)->NewStringUTF (env, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
NATIVE_NAME (setEmacsParams) (JNIEnv *env, jobject object,
|
NATIVE_NAME (setEmacsParams) (JNIEnv *env, jobject object,
|
||||||
jobject local_asset_manager,
|
jobject local_asset_manager,
|
||||||
|
|
@ -1514,6 +1528,8 @@ android_init_emacs_service (void)
|
||||||
FIND_METHOD (detect_mouse, "detectMouse", "()Z");
|
FIND_METHOD (detect_mouse, "detectMouse", "()Z");
|
||||||
FIND_METHOD (name_keysym, "nameKeysym", "(I)Ljava/lang/String;");
|
FIND_METHOD (name_keysym, "nameKeysym", "(I)Ljava/lang/String;");
|
||||||
FIND_METHOD (sync, "sync", "()V");
|
FIND_METHOD (sync, "sync", "()V");
|
||||||
|
FIND_METHOD (browse_url, "browseUrl", "(Ljava/lang/String;)"
|
||||||
|
"Ljava/lang/String;");
|
||||||
#undef FIND_METHOD
|
#undef FIND_METHOD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4735,6 +4751,51 @@ android_project_image_nearest (struct android_image *image,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Other miscellaneous functions. */
|
||||||
|
|
||||||
|
/* Ask the system to start browsing the specified encoded URL. Upon
|
||||||
|
failure, return a string describing the error. Else, value is
|
||||||
|
nil. */
|
||||||
|
|
||||||
|
Lisp_Object
|
||||||
|
android_browse_url (Lisp_Object url)
|
||||||
|
{
|
||||||
|
jobject value, string;
|
||||||
|
Lisp_Object tem;
|
||||||
|
const char *buffer;
|
||||||
|
|
||||||
|
string = android_build_string (url);
|
||||||
|
value = (*android_java_env)->CallObjectMethod (android_java_env,
|
||||||
|
emacs_service,
|
||||||
|
service_class.browse_url,
|
||||||
|
string);
|
||||||
|
android_exception_check ();
|
||||||
|
|
||||||
|
ANDROID_DELETE_LOCAL_REF (string);
|
||||||
|
|
||||||
|
/* If no string was returned, return Qnil. */
|
||||||
|
if (!value)
|
||||||
|
return Qnil;
|
||||||
|
|
||||||
|
buffer = (*android_java_env)->GetStringUTFChars (android_java_env,
|
||||||
|
(jstring) value,
|
||||||
|
NULL);
|
||||||
|
android_exception_check ();
|
||||||
|
|
||||||
|
/* Otherwise, build the string describing the error. */
|
||||||
|
tem = build_string_from_utf8 (buffer);
|
||||||
|
|
||||||
|
(*android_java_env)->ReleaseStringUTFChars (android_java_env,
|
||||||
|
(jstring) value,
|
||||||
|
buffer);
|
||||||
|
|
||||||
|
/* And return it. */
|
||||||
|
ANDROID_DELETE_LOCAL_REF (value);
|
||||||
|
return tem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#else /* ANDROID_STUBIFY */
|
#else /* ANDROID_STUBIFY */
|
||||||
|
|
||||||
/* X emulation functions for Android. */
|
/* X emulation functions for Android. */
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,10 @@ extern void android_closedir (struct android_dir *);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Very miscellaneous functions. */
|
||||||
|
|
||||||
|
extern Lisp_Object android_browse_url (Lisp_Object);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* JNI functions should not be built when Emacs is stubbed out for the
|
/* JNI functions should not be built when Emacs is stubbed out for the
|
||||||
|
|
|
||||||
|
|
@ -213,6 +213,25 @@ DEFUN ("android-clipboard-exists-p", Fandroid_clipboard_exists_p,
|
||||||
return rc ? Qt : Qnil;
|
return rc ? Qt : Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN ("android-browse-url", Fandroid_browse_url,
|
||||||
|
Sandroid_browse_url, 1, 1, 0,
|
||||||
|
doc: /* Start the system web browser.
|
||||||
|
Then, point the web browser to URL, which should be a URL-encoded
|
||||||
|
URL with a scheme specified. Signal an error upon failure. */)
|
||||||
|
(Lisp_Object url)
|
||||||
|
{
|
||||||
|
Lisp_Object value;
|
||||||
|
|
||||||
|
CHECK_STRING (url);
|
||||||
|
value = android_browse_url (url);
|
||||||
|
|
||||||
|
/* Signal an error upon failure. */
|
||||||
|
if (!NILP (value))
|
||||||
|
signal_error ("Error browsing URL", value);
|
||||||
|
|
||||||
|
return Qnil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -246,4 +265,5 @@ syms_of_androidselect (void)
|
||||||
defsubr (&Sandroid_set_clipboard);
|
defsubr (&Sandroid_set_clipboard);
|
||||||
defsubr (&Sandroid_get_clipboard);
|
defsubr (&Sandroid_get_clipboard);
|
||||||
defsubr (&Sandroid_clipboard_exists_p);
|
defsubr (&Sandroid_clipboard_exists_p);
|
||||||
|
defsubr (&Sandroid_browse_url);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
29
src/emacs.c
29
src/emacs.c
|
|
@ -744,6 +744,8 @@ argmatch (char **argv, int argc, const char *sstr, const char *lstr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined HAVE_ANDROID || defined ANDROID_STUBIFY
|
||||||
|
|
||||||
/* Find a name (absolute or relative) of the Emacs executable whose
|
/* Find a name (absolute or relative) of the Emacs executable whose
|
||||||
name (as passed into this program) is ARGV0. Called early in
|
name (as passed into this program) is ARGV0. Called early in
|
||||||
initialization by portable dumper loading code, so avoid Lisp and
|
initialization by portable dumper loading code, so avoid Lisp and
|
||||||
|
|
@ -843,6 +845,8 @@ find_emacs_executable (char const *argv0, ptrdiff_t *candidate_size)
|
||||||
#endif /* !WINDOWSNT */
|
#endif /* !WINDOWSNT */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_PDUMPER
|
#ifdef HAVE_PDUMPER
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
|
|
@ -875,6 +879,30 @@ dump_error_to_string (int result)
|
||||||
static char *
|
static char *
|
||||||
load_pdump (int argc, char **argv)
|
load_pdump (int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY
|
||||||
|
char *dump_file = NULL;
|
||||||
|
int skip_args = 0, result;
|
||||||
|
|
||||||
|
while (skip_args < argc - 1)
|
||||||
|
{
|
||||||
|
if (argmatch (argv, argc, "-dump-file", "--dump-file", 6,
|
||||||
|
&dump_file, &skip_args)
|
||||||
|
|| argmatch (argv, argc, "--", NULL, 2, NULL, &skip_args))
|
||||||
|
break;
|
||||||
|
skip_args++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dump_file)
|
||||||
|
return argv[0];
|
||||||
|
|
||||||
|
result = pdumper_load (dump_file, argv[0]);
|
||||||
|
|
||||||
|
if (result != PDUMPER_LOAD_SUCCESS)
|
||||||
|
fatal ("could not load dump file \"%s\": %s",
|
||||||
|
dump_file, dump_error_to_string (result));
|
||||||
|
return argv[0];
|
||||||
|
#else
|
||||||
|
|
||||||
const char *const suffix = ".pdmp";
|
const char *const suffix = ".pdmp";
|
||||||
int result;
|
int result;
|
||||||
char *emacs_executable = argv[0];
|
char *emacs_executable = argv[0];
|
||||||
|
|
@ -1067,6 +1095,7 @@ load_pdump (int argc, char **argv)
|
||||||
xfree (dump_file);
|
xfree (dump_file);
|
||||||
|
|
||||||
return emacs_executable;
|
return emacs_executable;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* HAVE_PDUMPER */
|
#endif /* HAVE_PDUMPER */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4072,10 +4072,12 @@ types. */)
|
||||||
{
|
{
|
||||||
eassert (initialized);
|
eassert (initialized);
|
||||||
|
|
||||||
|
#ifndef HAVE_ANDROID
|
||||||
if (! noninteractive)
|
if (! noninteractive)
|
||||||
error ("Dumping Emacs currently works only in batch mode. "
|
error ("Dumping Emacs currently works only in batch mode. "
|
||||||
"If you'd like it to work interactively, please consider "
|
"If you'd like it to work interactively, please consider "
|
||||||
"contributing a patch to Emacs.");
|
"contributing a patch to Emacs.");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (will_dump_with_unexec_p ())
|
if (will_dump_with_unexec_p ())
|
||||||
error ("This Emacs instance was started under the assumption "
|
error ("This Emacs instance was started under the assumption "
|
||||||
|
|
@ -5842,6 +5844,10 @@ void
|
||||||
syms_of_pdumper (void)
|
syms_of_pdumper (void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_PDUMPER
|
#ifdef HAVE_PDUMPER
|
||||||
|
unsigned char desired[sizeof fingerprint];
|
||||||
|
int i;
|
||||||
|
char hexbuf[2 * sizeof fingerprint];
|
||||||
|
|
||||||
defsubr (&Sdump_emacs_portable);
|
defsubr (&Sdump_emacs_portable);
|
||||||
defsubr (&Sdump_emacs_portable__sort_predicate);
|
defsubr (&Sdump_emacs_portable__sort_predicate);
|
||||||
defsubr (&Sdump_emacs_portable__sort_predicate_copied);
|
defsubr (&Sdump_emacs_portable__sort_predicate_copied);
|
||||||
|
|
@ -5854,5 +5860,17 @@ syms_of_pdumper (void)
|
||||||
DEFSYM (Qdump_file_name, "dump-file-name");
|
DEFSYM (Qdump_file_name, "dump-file-name");
|
||||||
DEFSYM (Qafter_pdump_load_hook, "after-pdump-load-hook");
|
DEFSYM (Qafter_pdump_load_hook, "after-pdump-load-hook");
|
||||||
defsubr (&Spdumper_stats);
|
defsubr (&Spdumper_stats);
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof fingerprint; i++)
|
||||||
|
desired[i] = fingerprint[i];
|
||||||
|
|
||||||
|
hexbuf_digest (hexbuf, desired, sizeof desired);
|
||||||
|
|
||||||
|
DEFVAR_LISP ("pdumper-fingerprint", Vpdumper_fingerprint,
|
||||||
|
doc: /* The fingerprint of this Emacs binary.
|
||||||
|
It is a string that is supposed to be unique to each build of
|
||||||
|
Emacs. */);
|
||||||
|
Vpdumper_fingerprint = make_unibyte_string ((char *) hexbuf,
|
||||||
|
sizeof hexbuf);
|
||||||
#endif /* HAVE_PDUMPER */
|
#endif /* HAVE_PDUMPER */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -320,7 +320,10 @@ sfntfont_android_composite_bitmap (unsigned char *restrict buffer,
|
||||||
{
|
{
|
||||||
unsigned int *src_row;
|
unsigned int *src_row;
|
||||||
unsigned int *dst_row;
|
unsigned int *dst_row;
|
||||||
unsigned int i, src_y, x, src_x, max_x, dst_x, lim_x;
|
unsigned int i, src_y, x, src_x, max_x, dst_x;
|
||||||
|
#ifdef __aarch64__
|
||||||
|
unsigned int lim_x;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((intptr_t) dest & 3 || bitmap_info->stride & 3)
|
if ((intptr_t) dest & 3 || bitmap_info->stride & 3)
|
||||||
/* This shouldn't be possible as Android is supposed to align the
|
/* This shouldn't be possible as Android is supposed to align the
|
||||||
|
|
@ -353,10 +356,10 @@ sfntfont_android_composite_bitmap (unsigned char *restrict buffer,
|
||||||
src_x = x + (rect->x - text_rectangle->x);
|
src_x = x + (rect->x - text_rectangle->x);
|
||||||
dst_x = x + rect->x;
|
dst_x = x + rect->x;
|
||||||
|
|
||||||
|
#ifdef __aarch64__
|
||||||
/* This is the largest value of src_x. */
|
/* This is the largest value of src_x. */
|
||||||
lim_x = max_x + (rect->x - text_rectangle->x);
|
lim_x = max_x + (rect->x - text_rectangle->x);
|
||||||
|
|
||||||
#ifdef __aarch64__
|
|
||||||
if (!sfntfont_android_over_8888 (src_row + src_x,
|
if (!sfntfont_android_over_8888 (src_row + src_x,
|
||||||
dst_row + dst_x,
|
dst_row + dst_x,
|
||||||
src_row + lim_x,
|
src_row + lim_x,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue