From aa0c4194b41f6ee0aeb83922d4cc39f585df78ac Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Sat, 24 Oct 2020 14:43:56 +0200 Subject: [PATCH] Include jansi native --- jansi/Makefile | 121 + jansi/Makefile.common | 199 ++ jansi/docker/dockcross-linux-x86 | 256 +++ jansi/docker/dockcross-windows-static-x64 | 256 +++ jansi/docker/dockcross-windows-static-x86 | 256 +++ jansi/pom.xml | 124 +- .../java/org/fusesource/jansi/AnsiMain.java | 16 +- .../fusesource/jansi/internal/CLibrary.java | 167 ++ .../jansi/internal/JansiLoader.java | 369 ++++ .../fusesource/jansi/internal/Kernel32.java | 576 +++++ .../org/fusesource/jansi/internal/OSInfo.java | 214 ++ .../jansi/internal/WindowsSupport.java | 127 ++ jansi/src/main/lib/inc_linux/jni.h | 1959 ++++++++++++++++ jansi/src/main/lib/inc_linux/jni_md.h | 24 + jansi/src/main/lib/inc_mac/jni.h | 1961 +++++++++++++++++ jansi/src/main/lib/inc_mac/jni_md.h | 23 + jansi/src/main/lib/inc_win/jni.h | 1951 ++++++++++++++++ jansi/src/main/lib/inc_win/jni_md.h | 19 + jansi/src/main/native/hawtjni.c | 32 + jansi/src/main/native/hawtjni.h | 136 ++ jansi/src/main/native/jansi.c | 713 ++++++ jansi/src/main/native/jansi.h | 84 + jansi/src/main/native/jansi_isatty.c | 116 + jansi/src/main/native/jansi_structs.c | 740 +++++++ jansi/src/main/native/jansi_structs.h | 137 ++ jansi/src/main/native/jansi_ttyname.c | 35 + .../internal/native/FreeBSD/x86/libjansi.so | Bin 0 -> 4128 bytes .../native/FreeBSD/x86_64/libjansi.so | Bin 0 -> 5696 bytes .../internal/native/Linux/arm/libjansi.so | Bin 0 -> 4400 bytes .../internal/native/Linux/arm64/libjansi.so | Bin 0 -> 5672 bytes .../internal/native/Linux/armv7/libjansi.so | Bin 0 -> 4220 bytes .../internal/native/Linux/ppc64/libjansi.so | Bin 0 -> 6376 bytes .../internal/native/Linux/x86/libjansi.so | Bin 0 -> 5368 bytes .../internal/native/Linux/x86_64/libjansi.so | Bin 0 -> 6504 bytes .../internal/native/Mac/x86/libjansi.jnilib | Bin 0 -> 9408 bytes .../native/Mac/x86_64/libjansi.jnilib | Bin 0 -> 5856 bytes .../internal/native/Windows/x86/jansi.dll | Bin 0 -> 29696 bytes .../internal/native/Windows/x86_64/jansi.dll | Bin 0 -> 33280 bytes .../jansi/internal/JansiLoaderTest.java | 26 + pom.xml | 6 - 40 files changed, 10532 insertions(+), 111 deletions(-) create mode 100644 jansi/Makefile create mode 100644 jansi/Makefile.common create mode 100755 jansi/docker/dockcross-linux-x86 create mode 100755 jansi/docker/dockcross-windows-static-x64 create mode 100755 jansi/docker/dockcross-windows-static-x86 create mode 100644 jansi/src/main/java/org/fusesource/jansi/internal/CLibrary.java create mode 100644 jansi/src/main/java/org/fusesource/jansi/internal/JansiLoader.java create mode 100644 jansi/src/main/java/org/fusesource/jansi/internal/Kernel32.java create mode 100644 jansi/src/main/java/org/fusesource/jansi/internal/OSInfo.java create mode 100644 jansi/src/main/java/org/fusesource/jansi/internal/WindowsSupport.java create mode 100644 jansi/src/main/lib/inc_linux/jni.h create mode 100644 jansi/src/main/lib/inc_linux/jni_md.h create mode 100644 jansi/src/main/lib/inc_mac/jni.h create mode 100644 jansi/src/main/lib/inc_mac/jni_md.h create mode 100644 jansi/src/main/lib/inc_win/jni.h create mode 100644 jansi/src/main/lib/inc_win/jni_md.h create mode 100644 jansi/src/main/native/hawtjni.c create mode 100644 jansi/src/main/native/hawtjni.h create mode 100644 jansi/src/main/native/jansi.c create mode 100644 jansi/src/main/native/jansi.h create mode 100644 jansi/src/main/native/jansi_isatty.c create mode 100644 jansi/src/main/native/jansi_structs.c create mode 100644 jansi/src/main/native/jansi_structs.h create mode 100644 jansi/src/main/native/jansi_ttyname.c create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/FreeBSD/x86/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/FreeBSD/x86_64/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/arm/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/arm64/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/armv7/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/ppc64/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/x86/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/x86_64/libjansi.so create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Mac/x86/libjansi.jnilib create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Mac/x86_64/libjansi.jnilib create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Windows/x86/jansi.dll create mode 100755 jansi/src/main/resources/org/fusesource/jansi/internal/native/Windows/x86_64/jansi.dll create mode 100644 jansi/src/test/java/org/fusesource/jansi/internal/JansiLoaderTest.java diff --git a/jansi/Makefile b/jansi/Makefile new file mode 100644 index 00000000..bde50d63 --- /dev/null +++ b/jansi/Makefile @@ -0,0 +1,121 @@ + +include Makefile.common + +RESOURCE_DIR = src/main/resources + +.phony: all package native native-all deploy + +all: jni-header package + +deploy: + mvn package deploy -DperformRelease=true + +MVN:=mvn +SRC:=src/main/native +JANSI_OUT:=$(TARGET)/native-$(OS_NAME)-$(OS_ARCH) + +CCFLAGS:= -I$(JANSI_OUT) $(CCFLAGS) + +$(JANSI_ARCHIVE): +# @mkdir -p $(@D) +# curl -L --max-redirs 0 -f -o$@ https://www.JANSI.org/2020/$(JANSI_AMAL_PREFIX).zip || \ +# curl -L --max-redirs 0 -f -o$@ https://www.JANSI.org/$(JANSI_AMAL_PREFIX).zip || \ +# curl -L --max-redirs 0 -f -o$@ https://www.JANSI.org/$(JANSI_OLD_AMAL_PREFIX).zip + +$(JANSI_UNPACKED): $(JANSI_ARCHIVE) +# unzip -qo $< -d $(TARGET)/tmp.$(version) +# (mv $(TARGET)/tmp.$(version)/$(JANSI_AMAL_PREFIX) $(TARGET) && rmdir $(TARGET)/tmp.$(version)) || mv $(TARGET)/tmp.$(version)/ $(TARGET)/$(JANSI_AMAL_PREFIX) +# touch $@ + + +test: + mvn test + +clean: clean-native clean-java clean-tests + +jni-header: + +$(JANSI_OUT)/%.o: $(SRC)/%.c + @mkdir -p $(@D) + $(info running: $(CC) $(CCFLAGS) -c $< -o $@) + $(CC) $(CCFLAGS) -c $< -o $@ + +$(JANSI_OUT)/$(LIBNAME): $(JANSI_OUT)/hawtjni.o $(JANSI_OUT)/jansi.o $(JANSI_OUT)/jansi_isatty.o $(JANSI_OUT)/jansi_structs.o $(JANSI_OUT)/jansi_ttyname.o + @mkdir -p $(@D) + $(CC) $(CCFLAGS) -o $@ $(JANSI_OUT)/hawtjni.o $(JANSI_OUT)/jansi.o $(JANSI_OUT)/jansi_isatty.o $(JANSI_OUT)/jansi_structs.o $(JANSI_OUT)/jansi_ttyname.o $(LINKFLAGS) + $(STRIP) $@ + +NATIVE_DIR=src/main/resources/org/fusesource/jansi/internal/native/$(OS_NAME)/$(OS_ARCH) +NATIVE_TARGET_DIR:=$(TARGET)/classes/org/fusesource/jansi/internal/native/$(OS_NAME)/$(OS_ARCH) +NATIVE_DLL:=$(NATIVE_DIR)/$(LIBNAME) + +# For cross-compilation, install docker. See also https://github.com/dockcross/dockcross +# Disabled linux-armv6 build because of this issue; https://github.com/dockcross/dockcross/issues/190 +native-all: linux-x86 linux-x86_64 linux-arm linux-armv7 \ + linux-arm64 linux-ppc64 win-x86 win-x86_64 mac-x86 mac-x86_64 freebsd-x86 freebsd-x86_64 + +native: $(NATIVE_DLL) + +$(NATIVE_DLL): $(JANSI_OUT)/$(LIBNAME) + @mkdir -p $(@D) + cp $< $@ + @mkdir -p $(NATIVE_TARGET_DIR) + cp $< $(NATIVE_TARGET_DIR)/$(LIBNAME) + +DOCKER_RUN_OPTS=--rm + +linux-x86: $(JANSI_UNPACKED) jni-header + ./docker/dockcross-linux-x86 bash -c 'make clean-native native OS_NAME=Linux OS_ARCH=x86' + +linux-x86_64: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/workdir -e CROSS_TRIPLE=x86_64-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=x86_64 + +linux-arm: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/workdir -e CROSS_TRIPLE=arm-linux-gnueabi multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=arm + +linux-armv7: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/workdir -e CROSS_TRIPLE=arm-linux-gnueabihf multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=armv7 + +linux-arm64: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/workdir -e CROSS_TRIPLE=aarch64-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=arm64 + +linux-ppc64: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/workdir -e CROSS_TRIPLE=powerpc64le-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=ppc64 + +win-x86: $(JANSI_UNPACKED) jni-header + ./docker/dockcross-windows-static-x86 bash -c 'make clean-native native CROSS_PREFIX=i686-w64-mingw32.static- OS_NAME=Windows OS_ARCH=x86' + +win-x86_64: $(JANSI_UNPACKED) jni-header + ./docker/dockcross-windows-static-x64 bash -c 'make clean-native native CROSS_PREFIX=x86_64-w64-mingw32.static- OS_NAME=Windows OS_ARCH=x86_64' + +mac-x86: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/workdir -e CROSS_TRIPLE=i386-apple-darwin multiarch/crossbuild make clean-native native OS_NAME=Mac OS_ARCH=x86 + +mac-x86_64: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/workdir -e CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild make clean-native native OS_NAME=Mac OS_ARCH=x86_64 + +freebsd-x86: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/build empterdose/freebsd-cross-build:9.3 make -C /build clean-native native CROSS_PREFIX=i386-freebsd9- OS_NAME=FreeBSD OS_ARCH=x86 + +freebsd-x86_64: $(JANSI_UNPACKED) jni-header + docker run -it $(DOCKER_RUN_OPTS) -v $$PWD:/build empterdose/freebsd-cross-build:9.3 make -C /build clean-native native CROSS_PREFIX=x86_64-freebsd9- OS_NAME=FreeBSD OS_ARCH=x86_64 + +#sparcv9: +# $(MAKE) native OS_NAME=SunOS OS_ARCH=sparcv9 + + +package: native-all + rm -rf target/dependency-maven-plugin-markers + $(MVN) package + +clean-native: + rm -rf $(JANSI_OUT) + +clean-java: + rm -rf $(TARGET)/*classes + rm -rf $(TARGET)/common-lib/* + rm -rf $(TARGET)/JANSI-jdbc-*jar + +clean-tests: + rm -rf $(TARGET)/{surefire*,testdb.jar*} + diff --git a/jansi/Makefile.common b/jansi/Makefile.common new file mode 100644 index 00000000..7a88f911 --- /dev/null +++ b/jansi/Makefile.common @@ -0,0 +1,199 @@ +ifndef JAVA_HOME +$(warning Set JAVA_HOME environment variable) +endif + +JAVA := "$$JAVA_HOME/bin/java" +JAVAC := "$$JAVA_HOME/bin/javac" +JAVAH := "$$JAVA_HOME/bin/javah" + +TARGET := target + +# building OSInfo.java +#$(info compiling OSInfo.java) +#$(shell mkdir -p target/lib) +#$(shell $(JAVAC) lib/OSInfo.java -d target/lib) + +#ifndef OS_NAME +#OS_NAME := $(shell $(JAVA) -cp target/lib org.fusesource.jansi.OSInfo --os) +#endif +#ifndef OS_ARCH +#OS_ARCH := $(shell $(JAVA) -cp target/lib org.fusesource.jansi.OSInfo --arch) +#endif + +# Windows uses different path separators +ifeq ($(OS_NAME),Windows) + sep := ; +else + sep := : +endif + +jansi := jansi-native-$(version) + +ifdef JAVA_HOME +jni_h := $(shell find -L "$(JAVA_HOME)" -name jni.h) +ifneq ($(jni_h),) +jni_include := $(shell dirname "$(jni_h)") +endif + +jni_md := $(shell find -L "$(JAVA_HOME)" -name jni_md.h) +ifneq ($(jni_md),) +jni_md_include := $(shell dirname "$(jni_md)") +endif +endif + +# os=Default is meant to be generic unix/linux + +known_targets := Linux-x86 Linux-x86_64 Linux-arm Linux-armv6 Linux-armv7 Linux-android-arm Linux-ppc64 Mac-x86 Mac-x86_64 DragonFly-x86_64 FreeBSD-x86_64 OpenBSD-x86_64 Windows-x86 Windows-x86_64 SunOS-sparcv9 HPUX-ia64_32 +target := $(OS_NAME)-$(OS_ARCH) + +ifeq (,$(findstring $(strip $(target)),$(known_targets))) + target := Default +endif + +# cross-compilation toolchain prefix (e.g. "arm-linux-gnueabi-") +CROSS_PREFIX := + +Default_CC := $(CROSS_PREFIX)gcc +Default_STRIP := $(CROSS_PREFIX)strip +Default_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden +Default_LINKFLAGS := -shared +Default_LIBNAME := libjansi.so +Default_JANSI_FLAGS := + +Linux-x86_CC := $(CROSS_PREFIX)gcc +Linux-x86_STRIP := $(CROSS_PREFIX)strip +Linux-x86_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -m32 -fvisibility=hidden +Linux-x86_LINKFLAGS := -shared -static-libgcc +Linux-x86_LIBNAME := libjansi.so +Linux-x86_JANSI_FLAGS := + +Linux-x86_64_CC := $(CROSS_PREFIX)gcc +Linux-x86_64_STRIP := $(CROSS_PREFIX)strip +Linux-x86_64_CCFLAGS := -Isrc/main/lib/inc_linux -I$(JAVA_HOME)/include -Os -fPIC -m64 -fvisibility=hidden +Linux-x86_64_LINKFLAGS := -shared -static-libgcc +Linux-x86_64_LIBNAME := libjansi.so +Linux-x86_64_JANSI_FLAGS := + +Linux-arm_CC := $(CROSS_PREFIX)gcc +Linux-arm_STRIP := $(CROSS_PREFIX)strip +Linux-arm_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -mfloat-abi=softfp -mfpu=vfp -fvisibility=hidden +Linux-arm_LINKFLAGS := -shared -static-libgcc +Linux-arm_LIBNAME := libjansi.so +Linux-arm_JANSI_FLAGS := + +Linux-armv6_CC := $(CROSS_PREFIX)gcc +Linux-armv6_STRIP := $(CROSS_PREFIX)strip +Linux-armv6_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -mfloat-abi=hard -mfpu=vfp -fPIC -fvisibility=hidden +Linux-armv6_LINKFLAGS := -shared -static-libgcc +Linux-armv6_LIBNAME := libjansi.so +Linux-armv6_JANSI_FLAGS := + +Linux-armv7_CC := $(CROSS_PREFIX)gcc +Linux-armv7_STRIP := $(CROSS_PREFIX)strip +Linux-armv7_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -mfloat-abi=hard -mfpu=vfp -fPIC -fvisibility=hidden +Linux-armv7_LINKFLAGS := -shared -static-libgcc +Linux-armv7_LIBNAME := libjansi.so +Linux-armv7_JANSI_FLAGS := + +Linux-arm64_CC := $(CROSS_PREFIX)gcc +Linux-arm64_STRIP := $(CROSS_PREFIX)strip +Linux-arm64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -mfloat-abi=hard -mfpu=vfp -fPIC -fvisibility=hidden +Linux-arm64_LINKFLAGS := -shared -static-libgcc +Linux-arm64_LIBNAME := libjansi.so +Linux-arm64_JANSI_FLAGS := + +Linux-ppc64_CC := $(CROSS_PREFIX)gcc +Linux-ppc64_STRIP := $(CROSS_PREFIX)strip +Linux-ppc64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden +Linux-ppc64_LINKFLAGS := -shared -static-libgcc +Linux-ppc64_LIBNAME := libjansi.so +Linux-ppc64_JANSI_FLAGS := + +DragonFly-x86_64_CC := $(CROSS_PREFIX)cc +DragonFly-x86_64_STRIP := $(CROSS_PREFIX)strip +DragonFly-x86_64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -O2 -fPIC -fvisibility=hidden +DragonFly-x86_64_LINKFLAGS := -shared +DragonFly-x86_64_LIBNAME := libjansi.so +DragonFly-x86_64_JANSI_FLAGS := + +FreeBSD-x86_CC := $(CROSS_PREFIX)gcc +FreeBSD-x86_STRIP := $(CROSS_PREFIX)strip +FreeBSD-x86_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden +FreeBSD-x86_LINKFLAGS := -shared +FreeBSD-x86_LIBNAME := libjansi.so +FreeBSD-x86_JANSI_FLAGS := + +FreeBSD-x86_64_CC := $(CROSS_PREFIX)gcc +FreeBSD-x86_64_STRIP := $(CROSS_PREFIX)strip +FreeBSD-x86_64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden +FreeBSD-x86_64_LINKFLAGS := -shared +FreeBSD-x86_64_LIBNAME := libjansi.so +FreeBSD-x86_64_JANSI_FLAGS := + +OpenBSD-x86_64_CC := $(CROSS_PREFIX)gcc +OpenBSD-x86_64_STRIP := $(CROSS_PREFIX)strip +OpenBSD-x86_64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden +OpenBSD-x86_64_LINKFLAGS := -shared +OpenBSD-x86_64_LIBNAME := libjansi.so +OpenBSD-x86_64_JANSI_FLAGS := + +SunOS-sparcv9_CC := $(CROSS_PREFIX)gcc +SunOS-sparcv9_STRIP := $(CROSS_PREFIX)strip +SunOS-sparcv9_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -O2s-fPIC -m64 -fvisibility=hidden +SunOS-sparcv9_LINKFLAGS := -shared -static-libgcc +SunOS-sparcv9_LIBNAME := libjansi.so +SunOS-sparcv9_JANSI_FLAGS := + +HPUX-ia64_32_CC := cc +HPUX-ia64_32_STRIP := strip +HPUX-ia64_32_CCFLAGS := -Isrc/main/lib/inc_linux +Osize +z -Bhidden +HPUX-ia64_32_LINKFLAGS := -b +HPUX-ia64_32_LIBNAME := libjansi.so +HPUX-ia64_32_JANSI_FLAGS := + +Mac-x86_CC := gcc +Mac-x86_STRIP := strip -x +Mac-x86_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_mac -Os -fPIC -mmacosx-version-min=10.4 -fvisibility=hidden +Mac-x86_LINKFLAGS := -dynamiclib +Mac-x86_LIBNAME := libjansi.jnilib +Mac-x86_JANSI_FLAGS := -DJANSI_ENABLE_LOCKING_STYLE=0 + +Mac-x86_64_CC := gcc -arch $(OS_ARCH) +Mac-x86_64_STRIP := strip -x +MAC_SDK := /Developer/SDKs/MacOSX10.10.sdk +ifeq ($(wildcard MAC_SDK),) + MAC_SDK := /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk +endif +Mac-x86_64_CCFLAGS := -I$(MAC_SDK)/System/Library/Frameworks/JavaVM.framework/Headers -Isrc/main/lib/inc_mac -Os -fPIC -mmacosx-version-min=10.6 -fvisibility=hidden +Mac-x86_64_LINKFLAGS := -dynamiclib +Mac-x86_64_LIBNAME := libjansi.jnilib +Mac-x86_64_JANSI_FLAGS := + +Windows-x86_CC := $(CROSS_PREFIX)gcc +Windows-x86_STRIP := $(CROSS_PREFIX)strip +Windows-x86_CCFLAGS := -D_JNI_IMPLEMENTATION_ -Isrc/main/lib/inc_win -Os +Windows-x86_LINKFLAGS := -Wl,--kill-at -shared -static-libgcc +Windows-x86_LIBNAME := jansi.dll +Windows-x86_JANSI_FLAGS := + +Windows-x86_64_CC := $(CROSS_PREFIX)gcc +Windows-x86_64_STRIP := $(CROSS_PREFIX)strip +Windows-x86_64_CCFLAGS := -D_JNI_IMPLEMENTATION_ -Isrc/main/lib/inc_win -Os +Windows-x86_64_LINKFLAGS := -Wl,--kill-at -shared -static-libgcc +Windows-x86_64_LIBNAME := jansi.dll +Windows-x86_64_JANSI_FLAGS := + + +CC := $($(target)_CC) +STRIP := $($(target)_STRIP) +CCFLAGS := $($(target)_CCFLAGS) +LINKFLAGS := $($(target)_LINKFLAGS) +LIBNAME := $($(target)_LIBNAME) +CCFLAGS := $(CCFLAGS) +ifneq ($(jni_include),) +CCFLAGS := $(CCFLAGS) -I"$(jni_include)" +endif +ifneq ($(jni_md_include),) +CCFLAGS := $(CCFLAGS) -I"$(jni_md_include)" +endif +$(info CCFLAGS=$(CCFLAGS)) diff --git a/jansi/docker/dockcross-linux-x86 b/jansi/docker/dockcross-linux-x86 new file mode 100755 index 00000000..d9c1800d --- /dev/null +++ b/jansi/docker/dockcross-linux-x86 @@ -0,0 +1,256 @@ +#!/usr/bin/env bash + +DEFAULT_DOCKCROSS_IMAGE=dockcross/linux-x86:latest + +#------------------------------------------------------------------------------ +# Helpers +# +err() { + echo -e >&2 ERROR: $@\\n +} + +die() { + err $@ + exit 1 +} + +has() { + # eg. has command update + local kind=$1 + local name=$2 + + type -t $kind:$name | grep -q function +} + +#------------------------------------------------------------------------------ +# Command handlers +# +command:update-image() { + docker pull $FINAL_IMAGE +} + +help:update-image() { + echo Pull the latest $FINAL_IMAGE . +} + +command:update-script() { + if cmp -s <( docker run --rm $FINAL_IMAGE ) $0; then + echo $0 is up to date + else + echo -n Updating $0 '... ' + docker run --rm $FINAL_IMAGE > $0 && echo ok + fi +} + +help:update-image() { + echo Update $0 from $FINAL_IMAGE . +} + +command:update() { + command:update-image + command:update-script +} + +help:update() { + echo Pull the latest $FINAL_IMAGE, and then update $0 from that. +} + +command:help() { + if [[ $# != 0 ]]; then + if ! has command $1; then + err \"$1\" is not an dockcross command + command:help + elif ! has help $1; then + err No help found for \"$1\" + else + help:$1 + fi + else + cat >&2 < +ENDHELP + exit 1 + fi +} + +#------------------------------------------------------------------------------ +# Option processing +# +special_update_command='' +while [[ $# != 0 ]]; do + case $1 in + + --) + shift + break + ;; + + --args|-a) + ARG_ARGS="$2" + shift 2 + ;; + + --config|-c) + ARG_CONFIG="$2" + shift 2 + ;; + + --image|-i) + ARG_IMAGE="$2" + shift 2 + ;; + update|update-image|update-script) + special_update_command=$1 + break + ;; + -*) + err Unknown option \"$1\" + command:help + exit + ;; + + *) + break + ;; + + esac +done + +# The precedence for options is: +# 1. command-line arguments +# 2. environment variables +# 3. defaults + +# Source the config file if it exists +DEFAULT_DOCKCROSS_CONFIG=~/.dockcross +FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}} + +[[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG" + +# Set the docker image +FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}} + +# Handle special update command +if [ "$special_update_command" != "" ]; then + case $special_update_command in + + update) + command:update + exit $? + ;; + + update-image) + command:update-image + exit $? + ;; + + update-script) + command:update-script + exit $? + ;; + + esac +fi + +# Set the docker run extra args (if any) +FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}} + +# Bash on Ubuntu on Windows +UBUNTU_ON_WINDOWS=$([ -e /proc/version ] && grep -l Microsoft /proc/version || echo "") +# MSYS, Git Bash, etc. +MSYS=$([ -e /proc/version ] && grep -l MINGW /proc/version || echo "") + +if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then + USER_IDS=(-e BUILDER_UID="$( id -u )" -e BUILDER_GID="$( id -g )" -e BUILDER_USER="$( id -un )" -e BUILDER_GROUP="$( id -gn )") +fi + +# Change the PWD when working in Docker on Windows +if [ -n "$UBUNTU_ON_WINDOWS" ]; then + WSL_ROOT="/mnt/" + CFG_FILE=/etc/wsl.conf + if [ -f "$CFG_FILE" ]; then + CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g') + eval "$CFG_CONTENT" + if [ -n "$root" ]; then + WSL_ROOT=$root + fi + fi + HOST_PWD=`pwd -P` + HOST_PWD=${HOST_PWD/$WSL_ROOT//} +elif [ -n "$MSYS" ]; then + HOST_PWD=$PWD + HOST_PWD=${HOST_PWD/\//} + HOST_PWD=${HOST_PWD/\//:\/} +else + HOST_PWD=$PWD + [ -L $HOST_PWD ] && HOST_PWD=$(readlink $HOST_PWD) +fi + +# Mount Additional Volumes +if [ -z "$SSH_DIR" ]; then + SSH_DIR="$HOME/.ssh" +fi + +HOST_VOLUMES= +if [ -e "$SSH_DIR" -a -z "$MSYS" ]; then + HOST_VOLUMES+="-v $SSH_DIR:/home/$(id -un)/.ssh" +fi + +#------------------------------------------------------------------------------ +# Now, finally, run the command in a container +# +TTY_ARGS= +tty -s && [ -z "$MSYS" ] && TTY_ARGS=-ti +CONTAINER_NAME=dockcross_$RANDOM +docker run $TTY_ARGS --name $CONTAINER_NAME \ + -v "$HOST_PWD":/work \ + $HOST_VOLUMES \ + "${USER_IDS[@]}" \ + $FINAL_ARGS \ + $FINAL_IMAGE "$@" +run_exit_code=$? + +# Attempt to delete container +rm_output=$(docker rm -f $CONTAINER_NAME 2>&1) +rm_exit_code=$? +if [[ $rm_exit_code != 0 ]]; then + if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then + : # Ignore error because of https://circleci.com/docs/docker-btrfs-error/ + else + echo "$rm_output" + exit $rm_exit_code + fi +fi + +exit $run_exit_code + +################################################################################ +# +# This image is not intended to be run manually. +# +# To create a dockcross helper script for the +# dockcross/linux-x86:latest image, run: +# +# docker run --rm dockcross/linux-x86:latest > dockcross-linux-x86-latest +# chmod +x dockcross-linux-x86-latest +# +# You may then wish to move the dockcross script to your PATH. +# +################################################################################ diff --git a/jansi/docker/dockcross-windows-static-x64 b/jansi/docker/dockcross-windows-static-x64 new file mode 100755 index 00000000..feacb768 --- /dev/null +++ b/jansi/docker/dockcross-windows-static-x64 @@ -0,0 +1,256 @@ +#!/usr/bin/env bash + +DEFAULT_DOCKCROSS_IMAGE=dockcross/windows-static-x64:latest + +#------------------------------------------------------------------------------ +# Helpers +# +err() { + echo -e >&2 ERROR: $@\\n +} + +die() { + err $@ + exit 1 +} + +has() { + # eg. has command update + local kind=$1 + local name=$2 + + type -t $kind:$name | grep -q function +} + +#------------------------------------------------------------------------------ +# Command handlers +# +command:update-image() { + docker pull $FINAL_IMAGE +} + +help:update-image() { + echo Pull the latest $FINAL_IMAGE . +} + +command:update-script() { + if cmp -s <( docker run --rm $FINAL_IMAGE ) $0; then + echo $0 is up to date + else + echo -n Updating $0 '... ' + docker run --rm $FINAL_IMAGE > $0 && echo ok + fi +} + +help:update-image() { + echo Update $0 from $FINAL_IMAGE . +} + +command:update() { + command:update-image + command:update-script +} + +help:update() { + echo Pull the latest $FINAL_IMAGE, and then update $0 from that. +} + +command:help() { + if [[ $# != 0 ]]; then + if ! has command $1; then + err \"$1\" is not an dockcross command + command:help + elif ! has help $1; then + err No help found for \"$1\" + else + help:$1 + fi + else + cat >&2 < +ENDHELP + exit 1 + fi +} + +#------------------------------------------------------------------------------ +# Option processing +# +special_update_command='' +while [[ $# != 0 ]]; do + case $1 in + + --) + shift + break + ;; + + --args|-a) + ARG_ARGS="$2" + shift 2 + ;; + + --config|-c) + ARG_CONFIG="$2" + shift 2 + ;; + + --image|-i) + ARG_IMAGE="$2" + shift 2 + ;; + update|update-image|update-script) + special_update_command=$1 + break + ;; + -*) + err Unknown option \"$1\" + command:help + exit + ;; + + *) + break + ;; + + esac +done + +# The precedence for options is: +# 1. command-line arguments +# 2. environment variables +# 3. defaults + +# Source the config file if it exists +DEFAULT_DOCKCROSS_CONFIG=~/.dockcross +FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}} + +[[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG" + +# Set the docker image +FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}} + +# Handle special update command +if [ "$special_update_command" != "" ]; then + case $special_update_command in + + update) + command:update + exit $? + ;; + + update-image) + command:update-image + exit $? + ;; + + update-script) + command:update-script + exit $? + ;; + + esac +fi + +# Set the docker run extra args (if any) +FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}} + +# Bash on Ubuntu on Windows +UBUNTU_ON_WINDOWS=$([ -e /proc/version ] && grep -l Microsoft /proc/version || echo "") +# MSYS, Git Bash, etc. +MSYS=$([ -e /proc/version ] && grep -l MINGW /proc/version || echo "") + +if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then + USER_IDS=(-e BUILDER_UID="$( id -u )" -e BUILDER_GID="$( id -g )" -e BUILDER_USER="$( id -un )" -e BUILDER_GROUP="$( id -gn )") +fi + +# Change the PWD when working in Docker on Windows +if [ -n "$UBUNTU_ON_WINDOWS" ]; then + WSL_ROOT="/mnt/" + CFG_FILE=/etc/wsl.conf + if [ -f "$CFG_FILE" ]; then + CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g') + eval "$CFG_CONTENT" + if [ -n "$root" ]; then + WSL_ROOT=$root + fi + fi + HOST_PWD=`pwd -P` + HOST_PWD=${HOST_PWD/$WSL_ROOT//} +elif [ -n "$MSYS" ]; then + HOST_PWD=$PWD + HOST_PWD=${HOST_PWD/\//} + HOST_PWD=${HOST_PWD/\//:\/} +else + HOST_PWD=$PWD + [ -L $HOST_PWD ] && HOST_PWD=$(readlink $HOST_PWD) +fi + +# Mount Additional Volumes +if [ -z "$SSH_DIR" ]; then + SSH_DIR="$HOME/.ssh" +fi + +HOST_VOLUMES= +if [ -e "$SSH_DIR" -a -z "$MSYS" ]; then + HOST_VOLUMES+="-v $SSH_DIR:/home/$(id -un)/.ssh" +fi + +#------------------------------------------------------------------------------ +# Now, finally, run the command in a container +# +TTY_ARGS= +tty -s && [ -z "$MSYS" ] && TTY_ARGS=-ti +CONTAINER_NAME=dockcross_$RANDOM +docker run $TTY_ARGS --name $CONTAINER_NAME \ + -v "$HOST_PWD":/work \ + $HOST_VOLUMES \ + "${USER_IDS[@]}" \ + $FINAL_ARGS \ + $FINAL_IMAGE "$@" +run_exit_code=$? + +# Attempt to delete container +rm_output=$(docker rm -f $CONTAINER_NAME 2>&1) +rm_exit_code=$? +if [[ $rm_exit_code != 0 ]]; then + if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then + : # Ignore error because of https://circleci.com/docs/docker-btrfs-error/ + else + echo "$rm_output" + exit $rm_exit_code + fi +fi + +exit $run_exit_code + +################################################################################ +# +# This image is not intended to be run manually. +# +# To create a dockcross helper script for the +# dockcross/windows-static-x64:latest image, run: +# +# docker run --rm dockcross/windows-static-x64:latest > dockcross-windows-static-x64-latest +# chmod +x dockcross-windows-static-x64-latest +# +# You may then wish to move the dockcross script to your PATH. +# +################################################################################ diff --git a/jansi/docker/dockcross-windows-static-x86 b/jansi/docker/dockcross-windows-static-x86 new file mode 100755 index 00000000..88b3d207 --- /dev/null +++ b/jansi/docker/dockcross-windows-static-x86 @@ -0,0 +1,256 @@ +#!/usr/bin/env bash + +DEFAULT_DOCKCROSS_IMAGE=dockcross/windows-static-x86:latest + +#------------------------------------------------------------------------------ +# Helpers +# +err() { + echo -e >&2 ERROR: $@\\n +} + +die() { + err $@ + exit 1 +} + +has() { + # eg. has command update + local kind=$1 + local name=$2 + + type -t $kind:$name | grep -q function +} + +#------------------------------------------------------------------------------ +# Command handlers +# +command:update-image() { + docker pull $FINAL_IMAGE +} + +help:update-image() { + echo Pull the latest $FINAL_IMAGE . +} + +command:update-script() { + if cmp -s <( docker run --rm $FINAL_IMAGE ) $0; then + echo $0 is up to date + else + echo -n Updating $0 '... ' + docker run --rm $FINAL_IMAGE > $0 && echo ok + fi +} + +help:update-image() { + echo Update $0 from $FINAL_IMAGE . +} + +command:update() { + command:update-image + command:update-script +} + +help:update() { + echo Pull the latest $FINAL_IMAGE, and then update $0 from that. +} + +command:help() { + if [[ $# != 0 ]]; then + if ! has command $1; then + err \"$1\" is not an dockcross command + command:help + elif ! has help $1; then + err No help found for \"$1\" + else + help:$1 + fi + else + cat >&2 < +ENDHELP + exit 1 + fi +} + +#------------------------------------------------------------------------------ +# Option processing +# +special_update_command='' +while [[ $# != 0 ]]; do + case $1 in + + --) + shift + break + ;; + + --args|-a) + ARG_ARGS="$2" + shift 2 + ;; + + --config|-c) + ARG_CONFIG="$2" + shift 2 + ;; + + --image|-i) + ARG_IMAGE="$2" + shift 2 + ;; + update|update-image|update-script) + special_update_command=$1 + break + ;; + -*) + err Unknown option \"$1\" + command:help + exit + ;; + + *) + break + ;; + + esac +done + +# The precedence for options is: +# 1. command-line arguments +# 2. environment variables +# 3. defaults + +# Source the config file if it exists +DEFAULT_DOCKCROSS_CONFIG=~/.dockcross +FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}} + +[[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG" + +# Set the docker image +FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}} + +# Handle special update command +if [ "$special_update_command" != "" ]; then + case $special_update_command in + + update) + command:update + exit $? + ;; + + update-image) + command:update-image + exit $? + ;; + + update-script) + command:update-script + exit $? + ;; + + esac +fi + +# Set the docker run extra args (if any) +FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}} + +# Bash on Ubuntu on Windows +UBUNTU_ON_WINDOWS=$([ -e /proc/version ] && grep -l Microsoft /proc/version || echo "") +# MSYS, Git Bash, etc. +MSYS=$([ -e /proc/version ] && grep -l MINGW /proc/version || echo "") + +if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then + USER_IDS=(-e BUILDER_UID="$( id -u )" -e BUILDER_GID="$( id -g )" -e BUILDER_USER="$( id -un )" -e BUILDER_GROUP="$( id -gn )") +fi + +# Change the PWD when working in Docker on Windows +if [ -n "$UBUNTU_ON_WINDOWS" ]; then + WSL_ROOT="/mnt/" + CFG_FILE=/etc/wsl.conf + if [ -f "$CFG_FILE" ]; then + CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g') + eval "$CFG_CONTENT" + if [ -n "$root" ]; then + WSL_ROOT=$root + fi + fi + HOST_PWD=`pwd -P` + HOST_PWD=${HOST_PWD/$WSL_ROOT//} +elif [ -n "$MSYS" ]; then + HOST_PWD=$PWD + HOST_PWD=${HOST_PWD/\//} + HOST_PWD=${HOST_PWD/\//:\/} +else + HOST_PWD=$PWD + [ -L $HOST_PWD ] && HOST_PWD=$(readlink $HOST_PWD) +fi + +# Mount Additional Volumes +if [ -z "$SSH_DIR" ]; then + SSH_DIR="$HOME/.ssh" +fi + +HOST_VOLUMES= +if [ -e "$SSH_DIR" -a -z "$MSYS" ]; then + HOST_VOLUMES+="-v $SSH_DIR:/home/$(id -un)/.ssh" +fi + +#------------------------------------------------------------------------------ +# Now, finally, run the command in a container +# +TTY_ARGS= +tty -s && [ -z "$MSYS" ] && TTY_ARGS=-ti +CONTAINER_NAME=dockcross_$RANDOM +docker run $TTY_ARGS --name $CONTAINER_NAME \ + -v "$HOST_PWD":/work \ + $HOST_VOLUMES \ + "${USER_IDS[@]}" \ + $FINAL_ARGS \ + $FINAL_IMAGE "$@" +run_exit_code=$? + +# Attempt to delete container +rm_output=$(docker rm -f $CONTAINER_NAME 2>&1) +rm_exit_code=$? +if [[ $rm_exit_code != 0 ]]; then + if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then + : # Ignore error because of https://circleci.com/docs/docker-btrfs-error/ + else + echo "$rm_output" + exit $rm_exit_code + fi +fi + +exit $run_exit_code + +################################################################################ +# +# This image is not intended to be run manually. +# +# To create a dockcross helper script for the +# dockcross/windows-static-x86:latest image, run: +# +# docker run --rm dockcross/windows-static-x86:latest > dockcross-windows-static-x86-latest +# chmod +x dockcross-windows-static-x86-latest +# +# You may then wish to move the dockcross script to your PATH. +# +################################################################################ diff --git a/jansi/pom.xml b/jansi/pom.xml index 91c2cfc6..0611f90b 100644 --- a/jansi/pom.xml +++ b/jansi/pom.xml @@ -29,57 +29,6 @@ Jansi is a java library for generating and interpreting ANSI escape sequences. - - org.fusesource.hawtjni - hawtjni-runtime - 1.17 - - - - org.fusesource.jansi - jansi-native - ${jansi-native-version} - - - - - org.fusesource.jansi - jansi-windows32 - ${jansi-native-version} - - - org.fusesource.jansi - jansi-windows64 - ${jansi-native-version} - - - org.fusesource.jansi - jansi-osx - ${jansi-native-version} - - - org.fusesource.jansi - jansi-linux32 - ${jansi-native-version} - - - org.fusesource.jansi - jansi-linux64 - ${jansi-native-version} - - - org.fusesource.jansi - jansi-freebsd32 - ${jansi-native-version} - - - org.fusesource.jansi - jansi-freebsd64 - ${jansi-native-version} - - junit junit @@ -89,63 +38,46 @@ + + + src/main/resources + true + + **/*.properties + + + + src/main/resources + false + + **/*.properties + + + - - org.apache.maven.plugins - maven-jar-plugin - - - - org.fusesource.jansi - - - - org.apache.maven.plugins maven-clean-plugin - 3.0.0 - - - - - org.fusesource.mvnplugins - maven-uberize-plugin - 1.5 - - - package - uberize - - + 3.1.0 org.apache.maven.plugins maven-surefire-plugin - 2.20 + 3.0.0-M5 true - once - -ea - false - ${project.build.directory} - - **/Abstract*.java - **/Test*.java - - - **/*Test.java - + 1 + true org.apache.felix maven-bundle-plugin - 2.5.4 + 5.1.1 bundle-manifest @@ -157,13 +89,10 @@ org.fusesource.jansi.AnsiMain - org.fusesource.jansi, - org.fusesource.jansi.internal + org.fusesource.jansi; + org.fusesource.jansi.internal; + -noimport:=true - - !org.fusesource.jansi, - !org.fusesource.jansi.internal - @@ -172,7 +101,10 @@ maven-jar-plugin - + + + org.fusesource.jansi + ${project.build.outputDirectory}/META-INF/MANIFEST.MF diff --git a/jansi/src/main/java/org/fusesource/jansi/AnsiMain.java b/jansi/src/main/java/org/fusesource/jansi/AnsiMain.java index 0c48e877..3249ed35 100644 --- a/jansi/src/main/java/org/fusesource/jansi/AnsiMain.java +++ b/jansi/src/main/java/org/fusesource/jansi/AnsiMain.java @@ -27,8 +27,9 @@ import java.io.Reader; import java.util.Properties; -import org.fusesource.hawtjni.runtime.Library; import org.fusesource.jansi.internal.CLibrary; +import org.fusesource.jansi.internal.JansiLoader; + import static org.fusesource.jansi.internal.CLibrary.isatty; /** @@ -50,20 +51,17 @@ */ public class AnsiMain { public static void main(String... args) throws IOException { - System.out.println("Jansi " + getJansiVersion() - + " (Jansi native " + getPomPropertiesVersion("org.fusesource.jansi/jansi-native") - + ", HawtJNI runtime " + getPomPropertiesVersion("org.fusesource.hawtjni/hawtjni-runtime") + ")"); + System.out.println("Jansi " + getJansiVersion()); System.out.println(); // info on native library System.out.println("library.jansi.path= " + System.getProperty("library.jansi.path", "")); System.out.println("library.jansi.version= " + System.getProperty("library.jansi.version", "")); - Library lib = new Library("jansi", CLibrary.class); - lib.load(); - System.out.println("Jansi native library loaded from " + lib.getNativeLibraryPath()); - if (lib.getNativeLibrarySourceUrl() != null) { - System.out.println(" which was auto-extracted from " + lib.getNativeLibrarySourceUrl()); + JansiLoader.initialize(); + System.out.println("Jansi native library loaded from " + JansiLoader.getNativeLibraryPath()); + if (JansiLoader.getNativeLibrarySourceUrl() != null) { + System.out.println(" which was auto-extracted from " + JansiLoader.getNativeLibrarySourceUrl()); } System.out.println(); diff --git a/jansi/src/main/java/org/fusesource/jansi/internal/CLibrary.java b/jansi/src/main/java/org/fusesource/jansi/internal/CLibrary.java new file mode 100644 index 00000000..d851c74d --- /dev/null +++ b/jansi/src/main/java/org/fusesource/jansi/internal/CLibrary.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.fusesource.jansi.internal; + +/** + * Interface to access some low level POSIX functions, loaded by + * HawtJNI Runtime + * as jansi library. + * + * @author Hiram Chirino + * @see JansiLoader + */ +@SuppressWarnings("unused") +public class CLibrary { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int STDOUT_FILENO = 1; + + public static int STDERR_FILENO = 2; + + public static boolean HAVE_ISATTY; + + public static boolean HAVE_TTYNAME; + + public static int TCSANOW; + public static int TCSADRAIN; + public static int TCSAFLUSH; + public static long TIOCGETA; + public static long TIOCSETA; + public static long TIOCGETD; + public static long TIOCSETD; + public static long TIOCGWINSZ; + public static long TIOCSWINSZ; + + /** + * test whether a file descriptor refers to a terminal + * + * @param fd file descriptor + * @return isatty() returns 1 if fd is an open file descriptor referring to a + * terminal; otherwise 0 is returned, and errno is set to indicate the + * error + * @see ISATTY(3) man-page + * @see ISATTY(3P) man-page + */ + public static native int isatty(int fd); + + public static native String ttyname(int filedes); + + /** + * The openpty() function finds an available pseudoterminal and returns + * file descriptors for the master and slave in amaster and aslave. + * + * @param amaster master return value + * @param aslave slave return value + * @param name filename return value + * @param termios optional pty attributes + * @param winsize optional size + * @return 0 on success + * @see OPENPTY(3) man-page + */ + public static native int openpty( + int[] amaster, + int[] aslave, + byte[] name, + Termios termios, + WinSize winsize); + + public static native int tcgetattr( + int filedes, + Termios termios); + + public static native int tcsetattr( + int filedes, + int optional_actions, + Termios termios); + + /** + * Control a STREAMS device. + * + * @see IOCTL(3P) man-page + */ + public static native int ioctl( + int filedes, + long request, + int[] params); + + public static native int ioctl( + int filedes, + long request, + WinSize params); + + /** + * Window sizes. + * + * @see IOCTL_TTY(2) man-page + */ + public static class WinSize { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + + public short ws_row; + public short ws_col; + public short ws_xpixel; + public short ws_ypixel; + + public WinSize() { + } + + public WinSize(short ws_row, short ws_col) { + this.ws_row = ws_row; + this.ws_col = ws_col; + } + } + + /** + * termios structure for termios functions, describing a general terminal interface that is + * provided to control asynchronous communications ports + * + * @see TERMIOS(3) man-page + */ + public static class Termios { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + + public long c_iflag; + public long c_oflag; + public long c_cflag; + public long c_lflag; + public byte[] c_cc = new byte[32]; + public long c_ispeed; + public long c_ospeed; + } + +} diff --git a/jansi/src/main/java/org/fusesource/jansi/internal/JansiLoader.java b/jansi/src/main/java/org/fusesource/jansi/internal/JansiLoader.java new file mode 100644 index 00000000..2914601a --- /dev/null +++ b/jansi/src/main/java/org/fusesource/jansi/internal/JansiLoader.java @@ -0,0 +1,369 @@ +/*-------------------------------------------------------------------------- + * Copyright 2007 Taro L. Saito + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *--------------------------------------------------------------------------*/ +package org.fusesource.jansi.internal; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import java.util.UUID; + +/** + * Set the system properties, org.jansi.lib.path, org.jansi.lib.name, + * appropriately so that jansi can find *.dll, *.jnilib and + * *.so files, according to the current OS (win, linux, mac). + *

+ * The library files are automatically extracted from this project's package + * (JAR). + *

+ * usage: call {@link #initialize()} before using Jansi. + */ +public class JansiLoader { + + private static boolean extracted = false; + private static String nativeLibraryPath; + private static String nativeLibrarySourceUrl; + + /** + * Loads Jansi native library. + * + * @return True if jansi native library is successfully loaded; false + * otherwise. + */ + public static synchronized boolean initialize() { + // only cleanup before the first extract + if (!extracted) { + cleanup(); + } + try { + loadJansiNativeLibrary(); + } catch (Exception e) { + throw new RuntimeException("Unable to load jansi native library", e); + } + return extracted; + } + + public static String getNativeLibraryPath() { + return nativeLibraryPath; + } + + public static String getNativeLibrarySourceUrl() { + return nativeLibrarySourceUrl; + } + + private static File getTempDir() { + return new File(System.getProperty("jansi.tmpdir", System.getProperty("java.io.tmpdir"))); + } + + /** + * Deleted old native libraries e.g. on Windows the DLL file is not removed + * on VM-Exit (bug #80) + */ + static void cleanup() { + String tempFolder = getTempDir().getAbsolutePath(); + File dir = new File(tempFolder); + + File[] nativeLibFiles = dir.listFiles(new FilenameFilter() { + private final String searchPattern = "jansi-" + getVersion(); + + public boolean accept(File dir, String name) { + return name.startsWith(searchPattern) && !name.endsWith(".lck"); + } + }); + if (nativeLibFiles != null) { + for (File nativeLibFile : nativeLibFiles) { + File lckFile = new File(nativeLibFile.getAbsolutePath() + ".lck"); + if (!lckFile.exists()) { + try { + nativeLibFile.delete(); + } catch (SecurityException e) { + System.err.println("Failed to delete old native lib" + e.getMessage()); + } + } + } + } + } + + private static boolean contentsEquals(InputStream in1, InputStream in2) throws IOException { + byte[] buffer1 = new byte[8192]; + byte[] buffer2 = new byte[8192]; + int numRead1 = 0; + int numRead2 = 0; + while (true) { + numRead1 = in1.read(buffer1); + numRead2 = in2.read(buffer2); + if (numRead1 > -1) { + if (numRead2 != numRead1) { + return false; + } + // Otherwise same number of bytes read + if (!Arrays.equals(buffer1, buffer2)) { + return false; + } + // Otherwise same bytes read, so continue ... + } else { + // Nothing more in stream 1 ... + return numRead2 < 0; + } + } + } + + /** + * Extracts and loads the specified library file to the target folder + * + * @param libFolderForCurrentOS Library path. + * @param libraryFileName Library name. + * @param targetFolder Target folder. + * @return + */ + private static boolean extractAndLoadLibraryFile(String libFolderForCurrentOS, String libraryFileName, + String targetFolder) { + String nativeLibraryFilePath = libFolderForCurrentOS + "/" + libraryFileName; + // Include architecture name in temporary filename in order to avoid conflicts + // when multiple JVMs with different architectures running at the same time + String uuid = UUID.randomUUID().toString(); + String extractedLibFileName = String.format("jansi-%s-%s-%s", getVersion(), uuid, libraryFileName); + String extractedLckFileName = extractedLibFileName + ".lck"; + + File extractedLibFile = new File(targetFolder, extractedLibFileName); + File extractedLckFile = new File(targetFolder, extractedLckFileName); + + try { + // Extract a native library file into the target directory + InputStream in = JansiLoader.class.getResourceAsStream(nativeLibraryFilePath); + try { + if (!extractedLckFile.exists()) { + new FileOutputStream(extractedLckFile).close(); + } + OutputStream out = new BufferedOutputStream(new FileOutputStream(extractedLibFile)); + try { + copy(in, out); + } finally { + out.close(); + } + } finally { + // Delete the extracted lib file on JVM exit. + extractedLibFile.deleteOnExit(); + extractedLckFile.deleteOnExit(); + in.close(); + } + + // Set executable (x) flag to enable Java to load the native library + extractedLibFile.setReadable(true); + extractedLibFile.setWritable(true, true); + extractedLibFile.setExecutable(true); + + // Check whether the contents are properly copied from the resource folder + InputStream nativeIn = JansiLoader.class.getResourceAsStream(nativeLibraryFilePath); + try { + InputStream extractedLibIn = new FileInputStream(extractedLibFile); + try { + if (!contentsEquals(nativeIn, extractedLibIn)) { + throw new RuntimeException(String.format("Failed to write a native library file at %s", extractedLibFile)); + } + } finally { + extractedLibIn.close(); + } + } finally { + nativeIn.close(); + } + + // Load library + if (loadNativeLibrary(extractedLibFile)) { + nativeLibrarySourceUrl = JansiLoader.class.getResource(nativeLibraryFilePath).toExternalForm(); + return true; + } + } catch (IOException e) { + System.err.println(e.getMessage()); + } + return false; + } + + private static void copy(InputStream in, OutputStream out) throws IOException { + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + } + + /** + * Loads native library using the given path and name of the library. + * + * @param libPath Path of the native library. + * @return True for successfully loading; false otherwise. + */ + private static boolean loadNativeLibrary(File libPath) { + if (libPath.exists()) { + + try { + String path = libPath.getAbsolutePath(); + System.load(path); + nativeLibraryPath = path; + return true; + } catch (UnsatisfiedLinkError e) { + System.err.println("Failed to load native library:" + libPath.getName() + ". osinfo: " + OSInfo.getNativeLibFolderPathForCurrentOS()); + System.err.println(e); + return false; + } + + } else { + return false; + } + } + + /** + * Loads jansi library using given path and name of the library. + * + * @throws + */ + private static void loadJansiNativeLibrary() throws Exception { + if (extracted) { + return; + } + + List triedPaths = new LinkedList(); + + // Try loading library from library.jansi.path library path */ + String jansiNativeLibraryPath = System.getProperty("library.jansi.path"); + String jansiNativeLibraryName = System.getProperty("library.jansi.name"); + if (jansiNativeLibraryName == null) { + jansiNativeLibraryName = System.mapLibraryName("jansi"); + if (jansiNativeLibraryName != null && jansiNativeLibraryName.endsWith(".dylib")) { + jansiNativeLibraryName = jansiNativeLibraryName.replace(".dylib", ".jnilib"); + } + } + + if (jansiNativeLibraryPath != null) { + String withOs = jansiNativeLibraryPath + "/" + OSInfo.getNativeLibFolderPathForCurrentOS(); + if (loadNativeLibrary(new File(withOs, jansiNativeLibraryName))) { + extracted = true; + return; + } else { + triedPaths.add(withOs); + } + + if (loadNativeLibrary(new File(jansiNativeLibraryPath, jansiNativeLibraryName))) { + extracted = true; + return; + } else { + triedPaths.add(jansiNativeLibraryPath); + } + } + + // Load the os-dependent library from the jar file + String packagePath = JansiLoader.class.getPackage().getName().replace('.', '/'); + jansiNativeLibraryPath = String.format("/%s/native/%s", packagePath, OSInfo.getNativeLibFolderPathForCurrentOS()); + boolean hasNativeLib = hasResource(jansiNativeLibraryPath + "/" + jansiNativeLibraryName); + + + if (hasNativeLib) { + // temporary library folder + String tempFolder = getTempDir().getAbsolutePath(); + // Try extracting the library from jar + if (extractAndLoadLibraryFile(jansiNativeLibraryPath, jansiNativeLibraryName, tempFolder)) { + extracted = true; + return; + } else { + triedPaths.add(jansiNativeLibraryPath); + } + } + + // As a last resort try from java.library.path + String javaLibraryPath = System.getProperty("java.library.path", ""); + for (String ldPath : javaLibraryPath.split(File.pathSeparator)) { + if (ldPath.isEmpty()) { + continue; + } + if (loadNativeLibrary(new File(ldPath, jansiNativeLibraryName))) { + extracted = true; + return; + } else { + triedPaths.add(ldPath); + } + } + + extracted = false; + throw new Exception(String.format("No native library found for os.name=%s, os.arch=%s, paths=[%s]", + OSInfo.getOSName(), OSInfo.getArchName(), join(triedPaths, File.pathSeparator))); + } + + private static boolean hasResource(String path) { + return JansiLoader.class.getResource(path) != null; + } + + + /** + * @return The major version of the jansi library. + */ + public static int getMajorVersion() { + String[] c = getVersion().split("\\."); + return (c.length > 0) ? Integer.parseInt(c[0]) : 1; + } + + /** + * @return The minor version of the jansi library. + */ + public static int getMinorVersion() { + String[] c = getVersion().split("\\."); + return (c.length > 1) ? Integer.parseInt(c[1]) : 0; + } + + /** + * @return The version of the jansi library. + */ + public static String getVersion() { + + URL versionFile = JansiLoader.class.getResource("/META-INF/maven/org.fusesource.jansi/jansi/pom.properties"); + + String version = "unknown"; + try { + if (versionFile != null) { + Properties versionData = new Properties(); + versionData.load(versionFile.openStream()); + version = versionData.getProperty("version", version); + version = version.trim().replaceAll("[^0-9\\.]", ""); + } + } catch (IOException e) { + System.err.println(e); + } + return version; + } + + private static String join(List list, String separator) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (String item : list) { + if (first) + first = false; + else + sb.append(separator); + + sb.append(item); + } + return sb.toString(); + } + +} diff --git a/jansi/src/main/java/org/fusesource/jansi/internal/Kernel32.java b/jansi/src/main/java/org/fusesource/jansi/internal/Kernel32.java new file mode 100644 index 00000000..2b3db8c5 --- /dev/null +++ b/jansi/src/main/java/org/fusesource/jansi/internal/Kernel32.java @@ -0,0 +1,576 @@ +/* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.fusesource.jansi.internal; + +import java.io.IOException; + +/** + * Interface to access Win32 base APIs. + * + * @author Hiram Chirino + * @author Guillaume Nodet + * @see JansiLoader + */ +@SuppressWarnings("unused") +public class Kernel32 { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static short FOREGROUND_BLUE; + public static short FOREGROUND_GREEN; + public static short FOREGROUND_RED; + public static short FOREGROUND_INTENSITY; + public static short BACKGROUND_BLUE; + public static short BACKGROUND_GREEN; + public static short BACKGROUND_RED; + public static short BACKGROUND_INTENSITY; + public static short COMMON_LVB_LEADING_BYTE; + public static short COMMON_LVB_TRAILING_BYTE; + public static short COMMON_LVB_GRID_HORIZONTAL; + public static short COMMON_LVB_GRID_LVERTICAL; + public static short COMMON_LVB_GRID_RVERTICAL; + public static short COMMON_LVB_REVERSE_VIDEO; + public static short COMMON_LVB_UNDERSCORE; + public static int FORMAT_MESSAGE_FROM_SYSTEM; + public static int STD_INPUT_HANDLE; + public static int STD_OUTPUT_HANDLE; + public static int STD_ERROR_HANDLE; + public static int INVALID_HANDLE_VALUE; + + + public static native long malloc(long size); + + public static native void free(long ptr); + + /** + * http://msdn.microsoft.com/en-us/library/ms686311%28VS.85%29.aspx + */ + static public class SMALL_RECT { + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + + public short left; + public short top; + public short right; + public short bottom; + + public short width() { + return (short) (right - left); + } + + public short height() { + return (short) (bottom - top); + } + + public SMALL_RECT copy() { + SMALL_RECT rc = new SMALL_RECT(); + rc.left = left; + rc.top = top; + rc.right = right; + rc.bottom = bottom; + return rc; + } + } + + /** + * see http://msdn.microsoft.com/en-us/library/ms686047%28VS.85%29.aspx + */ + public static native int SetConsoleTextAttribute( + long consoleOutput, + short attributes); + + public static class COORD { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + + public short x; + public short y; + + public COORD copy() { + COORD rc = new COORD(); + rc.x = x; + rc.y = y; + return rc; + } + } + + /** + * http://msdn.microsoft.com/en-us/library/ms682093%28VS.85%29.aspx + */ + public static class CONSOLE_SCREEN_BUFFER_INFO { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + + public COORD size = new COORD(); + public COORD cursorPosition = new COORD(); + public short attributes; + public SMALL_RECT window = new SMALL_RECT(); + public COORD maximumWindowSize = new COORD(); + + public int windowWidth() { + return window.width() + 1; + } + + public int windowHeight() { + return window.height() + 1; + } + } + + + // DWORD WINAPI WaitForSingleObject( + // _In_ HANDLE hHandle, + // _In_ DWORD dwMilliseconds + // ); + public static native int WaitForSingleObject(long hHandle, int dwMilliseconds); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms724211%28VS.85%29.aspx + */ + public static native int CloseHandle(long handle); + + + /** + * see: http://msdn.microsoft.com/en-us/library/ms679360(VS.85).aspx + */ + public static native int GetLastError(); + + public static native int FormatMessageW( + int flags, + long source, + int messageId, + int languageId, + byte[] buffer, + int size, + long[] args + ); + + + /** + * See: http://msdn.microsoft.com/en-us/library/ms683171%28VS.85%29.aspx + */ + public static native int GetConsoleScreenBufferInfo( + long consoleOutput, + CONSOLE_SCREEN_BUFFER_INFO consoleScreenBufferInfo); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms683231%28VS.85%29.aspx + */ + public static native long GetStdHandle(int stdHandle); + + /** + * http://msdn.microsoft.com/en-us/library/ms686025%28VS.85%29.aspx + */ + public static native int SetConsoleCursorPosition( + long consoleOutput, + COORD cursorPosition); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms682663%28VS.85%29.aspx + */ + public static native int FillConsoleOutputCharacterW( + long consoleOutput, + char character, + int length, + COORD writeCoord, + int[] numberOfCharsWritten); + + /** + * see: https://msdn.microsoft.com/en-us/library/ms682662%28VS.85%29.aspx + */ + public static native int FillConsoleOutputAttribute( + long consoleOutput, + short attribute, + int length, + COORD writeCoord, + int[] numberOfAttrsWritten); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms687401(v=VS.85).aspx + */ + public static native int WriteConsoleW( + long consoleOutput, + char[] buffer, + int numberOfCharsToWrite, + int[] numberOfCharsWritten, + long reserved); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms683167%28VS.85%29.aspx + */ + public static native int GetConsoleMode( + long handle, + int[] mode); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms686033%28VS.85%29.aspx + */ + public static native int SetConsoleMode( + long handle, + int mode); + + /** + * see: http://msdn.microsoft.com/en-us/library/078sfkak(VS.80).aspx + */ + public static native int _getch(); + + + /** + * see: http://msdn.microsoft.com/en-us/library/ms686050%28VS.85%29.aspx + * + * @return 0 if title was set successfully + */ + public static native int SetConsoleTitle( + String title); + + + /** + * see: http://msdn.microsoft.com/en-us/library/ms683169(v=VS.85).aspx + * + * @return the current output code page + */ + public static native int GetConsoleOutputCP(); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms686036(v=VS.85).aspx + * + * @return non 0 if code page was set + */ + public static native int SetConsoleOutputCP(int codePageID); + + /** + * see: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682013(v=vs.85).aspx + */ + public static class CHAR_INFO { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + + public short attributes; + public char unicodeChar; + } + + /** + * see: https://msdn.microsoft.com/en-us/library/windows/desktop/ms685107(v=vs.85).aspx + */ + public static native int ScrollConsoleScreenBuffer( + long consoleOutput, + SMALL_RECT scrollRectangle, + SMALL_RECT clipRectangle, + COORD destinationOrigin, + CHAR_INFO fill); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms684166(v=VS.85).aspx + */ + public static class KEY_EVENT_RECORD { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + public static int CAPSLOCK_ON; + public static int NUMLOCK_ON; + public static int SCROLLLOCK_ON; + public static int ENHANCED_KEY; + public static int LEFT_ALT_PRESSED; + public static int LEFT_CTRL_PRESSED; + public static int RIGHT_ALT_PRESSED; + public static int RIGHT_CTRL_PRESSED; + public static int SHIFT_PRESSED; + + public boolean keyDown; + public short repeatCount; + public short keyCode; + public short scanCode; + public char uchar; + public int controlKeyState; + + public String toString() { + return "KEY_EVENT_RECORD{" + + "keyDown=" + keyDown + + ", repeatCount=" + repeatCount + + ", keyCode=" + keyCode + + ", scanCode=" + scanCode + + ", uchar=" + uchar + + ", controlKeyState=" + controlKeyState + + '}'; + } + } + + /** + * see: http://msdn.microsoft.com/en-us/library/ms684239(v=VS.85).aspx + */ + public static class MOUSE_EVENT_RECORD { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + public static int FROM_LEFT_1ST_BUTTON_PRESSED; + public static int FROM_LEFT_2ND_BUTTON_PRESSED; + public static int FROM_LEFT_3RD_BUTTON_PRESSED; + public static int FROM_LEFT_4TH_BUTTON_PRESSED; + public static int RIGHTMOST_BUTTON_PRESSED; + + public static int CAPSLOCK_ON; + public static int NUMLOCK_ON; + public static int SCROLLLOCK_ON; + public static int ENHANCED_KEY; + public static int LEFT_ALT_PRESSED; + public static int LEFT_CTRL_PRESSED; + public static int RIGHT_ALT_PRESSED; + public static int RIGHT_CTRL_PRESSED; + public static int SHIFT_PRESSED; + + public static int DOUBLE_CLICK; + public static int MOUSE_HWHEELED; + public static int MOUSE_MOVED; + public static int MOUSE_WHEELED; + + public COORD mousePosition = new COORD(); + public int buttonState; + public int controlKeyState; + public int eventFlags; + + public String toString() { + return "MOUSE_EVENT_RECORD{" + + "mousePosition=" + mousePosition + + ", buttonState=" + buttonState + + ", controlKeyState=" + controlKeyState + + ", eventFlags=" + eventFlags + + '}'; + } + } + + /** + * see: http://msdn.microsoft.com/en-us/library/ms687093(v=VS.85).aspx + */ + public static class WINDOW_BUFFER_SIZE_RECORD { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + + public COORD size = new COORD(); + + public String toString() { + return "WINDOW_BUFFER_SIZE_RECORD{size=" + size + '}'; + } + } + + /** + * see: http://msdn.microsoft.com/en-us/library/ms683149(v=VS.85).aspx + */ + public static class FOCUS_EVENT_RECORD { + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + public boolean setFocus; + } + + /** + * see: http://msdn.microsoft.com/en-us/library/ms684213(v=VS.85).aspx + */ + public static class MENU_EVENT_RECORD { + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + public int commandId; + } + + /** + * see: http://msdn.microsoft.com/en-us/library/ms683499(v=VS.85).aspx + */ + public static class INPUT_RECORD { + + static { + JansiLoader.initialize(); + init(); + } + + private static native void init(); + + public static int SIZEOF; + public static short KEY_EVENT; + public static short MOUSE_EVENT; + public static short WINDOW_BUFFER_SIZE_EVENT; + public static short FOCUS_EVENT; + public static short MENU_EVENT; + public short eventType; + public KEY_EVENT_RECORD keyEvent = new KEY_EVENT_RECORD(); + public MOUSE_EVENT_RECORD mouseEvent = new MOUSE_EVENT_RECORD(); + public WINDOW_BUFFER_SIZE_RECORD windowBufferSizeEvent = new WINDOW_BUFFER_SIZE_RECORD(); + public MENU_EVENT_RECORD menuEvent = new MENU_EVENT_RECORD(); + public FOCUS_EVENT_RECORD focusEvent = new FOCUS_EVENT_RECORD(); + + public static native void memmove( + INPUT_RECORD dest, + long src, + long size); + + } + + /** + * see: http://msdn.microsoft.com/en-us/library/ms684961(v=VS.85).aspx + */ + private static native int ReadConsoleInputW( + long handle, + long inputRecord, + int length, + int[] eventsCount); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms684344(v=VS.85).aspx + */ + private static native int PeekConsoleInputW( + long handle, + long inputRecord, + int length, + int[] eventsCount); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms683207(v=VS.85).aspx + */ + public static native int GetNumberOfConsoleInputEvents( + long handle, + int[] numberOfEvents); + + /** + * see: http://msdn.microsoft.com/en-us/library/ms683147(v=VS.85).aspx + */ + public static native int FlushConsoleInputBuffer( + long handle); + + /** + * Return console input events. + */ + public static INPUT_RECORD[] readConsoleInputHelper( + long handle, int count, boolean peek) throws IOException { + int[] length = new int[1]; + int res; + long inputRecordPtr = 0; + try { + inputRecordPtr = malloc(INPUT_RECORD.SIZEOF * count); + if (inputRecordPtr == 0) { + throw new IOException("cannot allocate memory with JNI"); + } + res = peek ? + PeekConsoleInputW(handle, inputRecordPtr, count, length) + : ReadConsoleInputW(handle, inputRecordPtr, count, length); + if (res == 0) { + throw new IOException("ReadConsoleInputW failed"); + } + if (length[0] <= 0) { + return new INPUT_RECORD[0]; + } + INPUT_RECORD[] records = new INPUT_RECORD[length[0]]; + for (int i = 0; i < records.length; i++) { + records[i] = new INPUT_RECORD(); + INPUT_RECORD.memmove(records[i], inputRecordPtr + i * INPUT_RECORD.SIZEOF, INPUT_RECORD.SIZEOF); + } + return records; + } finally { + if (inputRecordPtr != 0) { + free(inputRecordPtr); + } + } + } + + /** + * Return console input key events (discard other events). + * + * @param count requested number of events + * @return array possibly of size smaller then count + */ + public static INPUT_RECORD[] readConsoleKeyInput(long handle, int count, boolean peek) + throws IOException { + while (true) { + // read events until we have keyboard events, the queue could be full + // of mouse events. + INPUT_RECORD[] evts = readConsoleInputHelper(handle, count, peek); + int keyEvtCount = 0; + for (INPUT_RECORD evt : evts) { + if (evt.eventType == INPUT_RECORD.KEY_EVENT) keyEvtCount++; + } + if (keyEvtCount > 0) { + INPUT_RECORD[] res = new INPUT_RECORD[keyEvtCount]; + int i = 0; + for (INPUT_RECORD evt : evts) { + if (evt.eventType == INPUT_RECORD.KEY_EVENT) { + res[i++] = evt; + } + } + return res; + } + } + } + + +} diff --git a/jansi/src/main/java/org/fusesource/jansi/internal/OSInfo.java b/jansi/src/main/java/org/fusesource/jansi/internal/OSInfo.java new file mode 100644 index 00000000..f7705eeb --- /dev/null +++ b/jansi/src/main/java/org/fusesource/jansi/internal/OSInfo.java @@ -0,0 +1,214 @@ +/*-------------------------------------------------------------------------- + * Copyright 2008 Taro L. Saito + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *--------------------------------------------------------------------------*/ +package org.fusesource.jansi.internal; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Locale; + +/** + * Provides OS name and architecture name. + * + * @author leo + */ +public class OSInfo { + + public static final String X86 = "x86"; + public static final String X86_64 = "x86_64"; + public static final String IA64_32 = "ia64_32"; + public static final String IA64 = "ia64"; + public static final String PPC = "ppc"; + public static final String PPC64 = "ppc64"; + + private static final HashMap archMapping = new HashMap(); + static { + // x86 mappings + archMapping.put(X86, X86); + archMapping.put("i386", X86); + archMapping.put("i486", X86); + archMapping.put("i586", X86); + archMapping.put("i686", X86); + archMapping.put("pentium", X86); + + // x86_64 mappings + archMapping.put(X86_64, X86_64); + archMapping.put("amd64", X86_64); + archMapping.put("em64t", X86_64); + archMapping.put("universal", X86_64); // Needed for openjdk7 in Mac + + // Itenium 64-bit mappings + archMapping.put(IA64, IA64); + archMapping.put("ia64w", IA64); + + // Itenium 32-bit mappings, usually an HP-UX construct + archMapping.put(IA64_32, IA64_32); + archMapping.put("ia64n", IA64_32); + + // PowerPC mappings + archMapping.put(PPC, PPC); + archMapping.put("power", PPC); + archMapping.put("powerpc", PPC); + archMapping.put("power_pc", PPC); + archMapping.put("power_rs", PPC); + + // TODO: PowerPC 64bit mappings + archMapping.put(PPC64, PPC64); + archMapping.put("power64", PPC64); + archMapping.put("powerpc64", PPC64); + archMapping.put("power_pc64", PPC64); + archMapping.put("power_rs64", PPC64); + } + + + public static void main(String[] args) { + if (args.length >= 1) { + if ("--os".equals(args[0])) { + System.out.print(getOSName()); + return; + } else if ("--arch".equals(args[0])) { + System.out.print(getArchName()); + return; + } + } + + System.out.print(getNativeLibFolderPathForCurrentOS()); + } + + public static String getNativeLibFolderPathForCurrentOS() { + return getOSName() + "/" + getArchName(); + } + + public static String getOSName() { + return translateOSNameToFolderName(System.getProperty("os.name")); + } + + public static boolean isAndroid() { + return System.getProperty("java.runtime.name", "").toLowerCase().contains("android"); + } + + public static boolean isAlpine() { + try { + Process p = Runtime.getRuntime().exec("cat /etc/os-release | grep ^ID"); + p.waitFor(); + + InputStream in = p.getInputStream(); + try { + return readFully(in).toLowerCase().contains("alpine"); + } finally { + in.close(); + } + + } catch (Throwable e) { + return false; + } + + } + + static String getHardwareName() { + try { + Process p = Runtime.getRuntime().exec("uname -m"); + p.waitFor(); + + InputStream in = p.getInputStream(); + try { + return readFully(in); + } finally { + in.close(); + } + } catch (Throwable e) { + System.err.println("Error while running uname -m: " + e.getMessage()); + return "unknown"; + } + } + + private static String readFully(InputStream in) throws IOException { + int readLen = 0; + ByteArrayOutputStream b = new ByteArrayOutputStream(); + byte[] buf = new byte[32]; + while ((readLen = in.read(buf, 0, buf.length)) >= 0) { + b.write(buf, 0, readLen); + } + return b.toString(); + } + + static String resolveArmArchType() { + if (System.getProperty("os.name").contains("Linux")) { + String armType = getHardwareName(); + // armType (uname -m) can be armv5t, armv5te, armv5tej, armv5tejl, armv6, armv7, armv7l, aarch64, i686 + if (armType.startsWith("armv6")) { + // Raspberry PI + return "armv6"; + } else if (armType.startsWith("armv7")) { + // Generic + return "armv7"; + } else if (armType.startsWith("armv5")) { + // Use armv5, soft-float ABI + return "arm"; + } else if (armType.equals("aarch64")) { + // Use arm64 + return "arm64"; + } + + // Java 1.8 introduces a system property to determine armel or armhf + // http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8005545 + String abi = System.getProperty("sun.arch.abi"); + if (abi != null && abi.startsWith("gnueabihf")) { + return "armv7"; + } + } + // Use armv5, soft-float ABI + return "arm"; + } + + public static String getArchName() { + String osArch = System.getProperty("os.arch"); + // For Android + if (isAndroid()) { + return "android-arm"; + } + + if (osArch.startsWith("arm")) { + osArch = resolveArmArchType(); + } else { + String lc = osArch.toLowerCase(Locale.US); + if (archMapping.containsKey(lc)) + return archMapping.get(lc); + } + return translateArchNameToFolderName(osArch); + } + + static String translateOSNameToFolderName(String osName) { + if (osName.contains("Windows")) { + return "Windows"; + } else if (osName.contains("Mac") || osName.contains("Darwin")) { + return "Mac"; +// } else if (isAlpine()) { +// return "Linux-Alpine"; + } else if (osName.contains("Linux")) { + return "Linux"; + } else if (osName.contains("AIX")) { + return "AIX"; + } else { + return osName.replaceAll("\\W", ""); + } + } + + static String translateArchNameToFolderName(String archName) { + return archName.replaceAll("\\W", ""); + } +} diff --git a/jansi/src/main/java/org/fusesource/jansi/internal/WindowsSupport.java b/jansi/src/main/java/org/fusesource/jansi/internal/WindowsSupport.java new file mode 100644 index 00000000..4c2b4713 --- /dev/null +++ b/jansi/src/main/java/org/fusesource/jansi/internal/WindowsSupport.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.fusesource.jansi.internal; + +import static org.fusesource.jansi.internal.Kernel32.*; + +import org.fusesource.jansi.internal.Kernel32.CONSOLE_SCREEN_BUFFER_INFO; + +import java.io.IOException; + +/** + * Windows helper to ease Kernel32 usage. + * + * @author Hiram Chirino + */ +public class WindowsSupport { + + public static String getLastErrorMessage() { + return org.fusesource.jansi.WindowsSupport.getLastErrorMessage(); + } + + ////////////////////////////////////////////////////////////////////////// 00 + // + // The following helper methods are for jline + // + ////////////////////////////////////////////////////////////////////////// + + public static int readByte() { + return _getch(); + } + + public static int getConsoleMode() { + long hConsole = GetStdHandle (STD_INPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return -1; + int mode[] = new int[1]; + if (GetConsoleMode (hConsole, mode)==0) + return -1; + return mode[0]; + } + + public static void setConsoleMode(int mode) { + long hConsole = GetStdHandle (STD_INPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return; + SetConsoleMode (hConsole, mode); + } + + public static int getWindowsTerminalWidth() { + long outputHandle = GetStdHandle (STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO info = new CONSOLE_SCREEN_BUFFER_INFO(); + GetConsoleScreenBufferInfo (outputHandle, info); + return info.windowWidth(); + } + + public static int getWindowsTerminalHeight() { + long outputHandle = GetStdHandle (STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO info = new CONSOLE_SCREEN_BUFFER_INFO(); + GetConsoleScreenBufferInfo (outputHandle, info); + return info.windowHeight(); + } + + public static int writeConsole(String msg) { + long hConsole = GetStdHandle (STD_OUTPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return 0; + char[] chars = msg.toCharArray(); + int[] written = new int[1]; + if (WriteConsoleW(hConsole, chars, chars.length, written, 0) != 0) { + return written[0]; + } else { + return 0; + } + } + + public static INPUT_RECORD[] readConsoleInput(int count, int dwMilliseconds) throws IOException { + long hConsole = GetStdHandle (STD_INPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return null; + if (WaitForSingleObject(hConsole, dwMilliseconds) != 0) + return null; + return readConsoleInputHelper(hConsole, count, false); + } + + public static INPUT_RECORD[] readConsoleInput(int count) throws IOException { + long hConsole = GetStdHandle (STD_INPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return null; + return readConsoleInputHelper(hConsole, count, false); + } + + public static INPUT_RECORD[] peekConsoleInput(int count, int dwMilliseconds) throws IOException { + long hConsole = GetStdHandle (STD_INPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return null; + if (WaitForSingleObject(hConsole, dwMilliseconds) != 0) + return null; + return readConsoleInputHelper(hConsole, count, true); + } + + public static INPUT_RECORD[] peekConsoleInput(int count) throws IOException { + long hConsole = GetStdHandle (STD_INPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return null; + return readConsoleInputHelper(hConsole, count, true); + } + + public static void flushConsoleInputBuffer() { + long hConsole = GetStdHandle (STD_INPUT_HANDLE); + if (hConsole == INVALID_HANDLE_VALUE) + return; + FlushConsoleInputBuffer(hConsole); + } +} diff --git a/jansi/src/main/lib/inc_linux/jni.h b/jansi/src/main/lib/inc_linux/jni.h new file mode 100644 index 00000000..dc2c8f64 --- /dev/null +++ b/jansi/src/main/lib/inc_linux/jni.h @@ -0,0 +1,1959 @@ +/* + * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * We used part of Netscape's Java Runtime Interface (JRI) as the starting + * point of our design and implementation. + */ + +/****************************************************************************** + * Java Runtime Interface + * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved. + *****************************************************************************/ + +#ifndef _JAVASOFT_JNI_H_ +#define _JAVASOFT_JNI_H_ + +#include +#include + +/* jni_md.h contains the machine-dependent typedefs for jbyte, jint + and jlong */ + +#include "jni_md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * JNI Types + */ + +#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H + +typedef unsigned char jboolean; +typedef unsigned short jchar; +typedef short jshort; +typedef float jfloat; +typedef double jdouble; + +typedef jint jsize; + +#ifdef __cplusplus + +class _jobject {}; +class _jclass : public _jobject {}; +class _jthrowable : public _jobject {}; +class _jstring : public _jobject {}; +class _jarray : public _jobject {}; +class _jbooleanArray : public _jarray {}; +class _jbyteArray : public _jarray {}; +class _jcharArray : public _jarray {}; +class _jshortArray : public _jarray {}; +class _jintArray : public _jarray {}; +class _jlongArray : public _jarray {}; +class _jfloatArray : public _jarray {}; +class _jdoubleArray : public _jarray {}; +class _jobjectArray : public _jarray {}; + +typedef _jobject *jobject; +typedef _jclass *jclass; +typedef _jthrowable *jthrowable; +typedef _jstring *jstring; +typedef _jarray *jarray; +typedef _jbooleanArray *jbooleanArray; +typedef _jbyteArray *jbyteArray; +typedef _jcharArray *jcharArray; +typedef _jshortArray *jshortArray; +typedef _jintArray *jintArray; +typedef _jlongArray *jlongArray; +typedef _jfloatArray *jfloatArray; +typedef _jdoubleArray *jdoubleArray; +typedef _jobjectArray *jobjectArray; + +#else + +struct _jobject; + +typedef struct _jobject *jobject; +typedef jobject jclass; +typedef jobject jthrowable; +typedef jobject jstring; +typedef jobject jarray; +typedef jarray jbooleanArray; +typedef jarray jbyteArray; +typedef jarray jcharArray; +typedef jarray jshortArray; +typedef jarray jintArray; +typedef jarray jlongArray; +typedef jarray jfloatArray; +typedef jarray jdoubleArray; +typedef jarray jobjectArray; + +#endif + +typedef jobject jweak; + +typedef union jvalue { + jboolean z; + jbyte b; + jchar c; + jshort s; + jint i; + jlong j; + jfloat f; + jdouble d; + jobject l; +} jvalue; + +struct _jfieldID; +typedef struct _jfieldID *jfieldID; + +struct _jmethodID; +typedef struct _jmethodID *jmethodID; + +/* Return values from jobjectRefType */ +typedef enum _jobjectType { + JNIInvalidRefType = 0, + JNILocalRefType = 1, + JNIGlobalRefType = 2, + JNIWeakGlobalRefType = 3 +} jobjectRefType; + + +#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */ + +/* + * jboolean constants + */ + +#define JNI_FALSE 0 +#define JNI_TRUE 1 + +/* + * possible return values for JNI functions. + */ + +#define JNI_OK 0 /* success */ +#define JNI_ERR (-1) /* unknown error */ +#define JNI_EDETACHED (-2) /* thread detached from the VM */ +#define JNI_EVERSION (-3) /* JNI version error */ +#define JNI_ENOMEM (-4) /* not enough memory */ +#define JNI_EEXIST (-5) /* VM already created */ +#define JNI_EINVAL (-6) /* invalid arguments */ + +/* + * used in ReleaseScalarArrayElements + */ + +#define JNI_COMMIT 1 +#define JNI_ABORT 2 + +/* + * used in RegisterNatives to describe native method name, signature, + * and function pointer. + */ + +typedef struct { + char *name; + char *signature; + void *fnPtr; +} JNINativeMethod; + +/* + * JNI Native Method Interface. + */ + +struct JNINativeInterface_; + +struct JNIEnv_; + +#ifdef __cplusplus +typedef JNIEnv_ JNIEnv; +#else +typedef const struct JNINativeInterface_ *JNIEnv; +#endif + +/* + * JNI Invocation Interface. + */ + +struct JNIInvokeInterface_; + +struct JavaVM_; + +#ifdef __cplusplus +typedef JavaVM_ JavaVM; +#else +typedef const struct JNIInvokeInterface_ *JavaVM; +#endif + +struct JNINativeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + + void *reserved3; + jint (JNICALL *GetVersion)(JNIEnv *env); + + jclass (JNICALL *DefineClass) + (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, + jsize len); + jclass (JNICALL *FindClass) + (JNIEnv *env, const char *name); + + jmethodID (JNICALL *FromReflectedMethod) + (JNIEnv *env, jobject method); + jfieldID (JNICALL *FromReflectedField) + (JNIEnv *env, jobject field); + + jobject (JNICALL *ToReflectedMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic); + + jclass (JNICALL *GetSuperclass) + (JNIEnv *env, jclass sub); + jboolean (JNICALL *IsAssignableFrom) + (JNIEnv *env, jclass sub, jclass sup); + + jobject (JNICALL *ToReflectedField) + (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic); + + jint (JNICALL *Throw) + (JNIEnv *env, jthrowable obj); + jint (JNICALL *ThrowNew) + (JNIEnv *env, jclass clazz, const char *msg); + jthrowable (JNICALL *ExceptionOccurred) + (JNIEnv *env); + void (JNICALL *ExceptionDescribe) + (JNIEnv *env); + void (JNICALL *ExceptionClear) + (JNIEnv *env); + void (JNICALL *FatalError) + (JNIEnv *env, const char *msg); + + jint (JNICALL *PushLocalFrame) + (JNIEnv *env, jint capacity); + jobject (JNICALL *PopLocalFrame) + (JNIEnv *env, jobject result); + + jobject (JNICALL *NewGlobalRef) + (JNIEnv *env, jobject lobj); + void (JNICALL *DeleteGlobalRef) + (JNIEnv *env, jobject gref); + void (JNICALL *DeleteLocalRef) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsSameObject) + (JNIEnv *env, jobject obj1, jobject obj2); + jobject (JNICALL *NewLocalRef) + (JNIEnv *env, jobject ref); + jint (JNICALL *EnsureLocalCapacity) + (JNIEnv *env, jint capacity); + + jobject (JNICALL *AllocObject) + (JNIEnv *env, jclass clazz); + jobject (JNICALL *NewObject) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *NewObjectV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *NewObjectA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jclass (JNICALL *GetObjectClass) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsInstanceOf) + (JNIEnv *env, jobject obj, jclass clazz); + + jmethodID (JNICALL *GetMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallObjectMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jobject (JNICALL *CallObjectMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jobject (JNICALL *CallObjectMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jboolean (JNICALL *CallBooleanMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jboolean (JNICALL *CallBooleanMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jboolean (JNICALL *CallBooleanMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jbyte (JNICALL *CallByteMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jbyte (JNICALL *CallByteMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jbyte (JNICALL *CallByteMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallCharMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jchar (JNICALL *CallCharMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jchar (JNICALL *CallCharMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallShortMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jshort (JNICALL *CallShortMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jshort (JNICALL *CallShortMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallIntMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jint (JNICALL *CallIntMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jint (JNICALL *CallIntMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallLongMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jlong (JNICALL *CallLongMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jlong (JNICALL *CallLongMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallFloatMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jfloat (JNICALL *CallFloatMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jfloat (JNICALL *CallFloatMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallDoubleMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jdouble (JNICALL *CallDoubleMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jdouble (JNICALL *CallDoubleMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallVoidMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + void (JNICALL *CallVoidMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + void (JNICALL *CallVoidMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jobject (JNICALL *CallNonvirtualObjectMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallNonvirtualObjectMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jobject (JNICALL *CallNonvirtualObjectMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jboolean (JNICALL *CallNonvirtualBooleanMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallNonvirtualBooleanMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jboolean (JNICALL *CallNonvirtualBooleanMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jbyte (JNICALL *CallNonvirtualByteMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallNonvirtualByteMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jbyte (JNICALL *CallNonvirtualByteMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jchar (JNICALL *CallNonvirtualCharMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallNonvirtualCharMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jchar (JNICALL *CallNonvirtualCharMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jshort (JNICALL *CallNonvirtualShortMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallNonvirtualShortMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jshort (JNICALL *CallNonvirtualShortMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jint (JNICALL *CallNonvirtualIntMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallNonvirtualIntMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jint (JNICALL *CallNonvirtualIntMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jlong (JNICALL *CallNonvirtualLongMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallNonvirtualLongMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jlong (JNICALL *CallNonvirtualLongMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jfloat (JNICALL *CallNonvirtualFloatMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallNonvirtualFloatMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jfloat (JNICALL *CallNonvirtualFloatMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jdouble (JNICALL *CallNonvirtualDoubleMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallNonvirtualDoubleMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jdouble (JNICALL *CallNonvirtualDoubleMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + void (JNICALL *CallNonvirtualVoidMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + void (JNICALL *CallNonvirtualVoidMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + void (JNICALL *CallNonvirtualVoidMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jfieldID (JNICALL *GetFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *GetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jboolean (JNICALL *GetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jbyte (JNICALL *GetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jchar (JNICALL *GetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jshort (JNICALL *GetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jint (JNICALL *GetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jlong (JNICALL *GetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jfloat (JNICALL *GetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jdouble (JNICALL *GetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + + void (JNICALL *SetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val); + void (JNICALL *SetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val); + void (JNICALL *SetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val); + void (JNICALL *SetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val); + void (JNICALL *SetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val); + void (JNICALL *SetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jint val); + void (JNICALL *SetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val); + void (JNICALL *SetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val); + void (JNICALL *SetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val); + + jmethodID (JNICALL *GetStaticMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallStaticObjectMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallStaticObjectMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *CallStaticObjectMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jboolean (JNICALL *CallStaticBooleanMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallStaticBooleanMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jboolean (JNICALL *CallStaticBooleanMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jbyte (JNICALL *CallStaticByteMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallStaticByteMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jbyte (JNICALL *CallStaticByteMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallStaticCharMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallStaticCharMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jchar (JNICALL *CallStaticCharMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallStaticShortMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallStaticShortMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jshort (JNICALL *CallStaticShortMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallStaticIntMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallStaticIntMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jint (JNICALL *CallStaticIntMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallStaticLongMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallStaticLongMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jlong (JNICALL *CallStaticLongMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallStaticFloatMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallStaticFloatMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jfloat (JNICALL *CallStaticFloatMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallStaticDoubleMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallStaticDoubleMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jdouble (JNICALL *CallStaticDoubleMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallStaticVoidMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, ...); + void (JNICALL *CallStaticVoidMethodV) + (JNIEnv *env, jclass cls, jmethodID methodID, va_list args); + void (JNICALL *CallStaticVoidMethodA) + (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args); + + jfieldID (JNICALL *GetStaticFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + jobject (JNICALL *GetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jboolean (JNICALL *GetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jbyte (JNICALL *GetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jchar (JNICALL *GetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jshort (JNICALL *GetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jint (JNICALL *GetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jlong (JNICALL *GetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jfloat (JNICALL *GetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jdouble (JNICALL *GetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + + void (JNICALL *SetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value); + void (JNICALL *SetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value); + void (JNICALL *SetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value); + void (JNICALL *SetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value); + void (JNICALL *SetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value); + void (JNICALL *SetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value); + void (JNICALL *SetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value); + void (JNICALL *SetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value); + void (JNICALL *SetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value); + + jstring (JNICALL *NewString) + (JNIEnv *env, const jchar *unicode, jsize len); + jsize (JNICALL *GetStringLength) + (JNIEnv *env, jstring str); + const jchar *(JNICALL *GetStringChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringChars) + (JNIEnv *env, jstring str, const jchar *chars); + + jstring (JNICALL *NewStringUTF) + (JNIEnv *env, const char *utf); + jsize (JNICALL *GetStringUTFLength) + (JNIEnv *env, jstring str); + const char* (JNICALL *GetStringUTFChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringUTFChars) + (JNIEnv *env, jstring str, const char* chars); + + + jsize (JNICALL *GetArrayLength) + (JNIEnv *env, jarray array); + + jobjectArray (JNICALL *NewObjectArray) + (JNIEnv *env, jsize len, jclass clazz, jobject init); + jobject (JNICALL *GetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index); + void (JNICALL *SetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index, jobject val); + + jbooleanArray (JNICALL *NewBooleanArray) + (JNIEnv *env, jsize len); + jbyteArray (JNICALL *NewByteArray) + (JNIEnv *env, jsize len); + jcharArray (JNICALL *NewCharArray) + (JNIEnv *env, jsize len); + jshortArray (JNICALL *NewShortArray) + (JNIEnv *env, jsize len); + jintArray (JNICALL *NewIntArray) + (JNIEnv *env, jsize len); + jlongArray (JNICALL *NewLongArray) + (JNIEnv *env, jsize len); + jfloatArray (JNICALL *NewFloatArray) + (JNIEnv *env, jsize len); + jdoubleArray (JNICALL *NewDoubleArray) + (JNIEnv *env, jsize len); + + jboolean * (JNICALL *GetBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *isCopy); + jbyte * (JNICALL *GetByteArrayElements) + (JNIEnv *env, jbyteArray array, jboolean *isCopy); + jchar * (JNICALL *GetCharArrayElements) + (JNIEnv *env, jcharArray array, jboolean *isCopy); + jshort * (JNICALL *GetShortArrayElements) + (JNIEnv *env, jshortArray array, jboolean *isCopy); + jint * (JNICALL *GetIntArrayElements) + (JNIEnv *env, jintArray array, jboolean *isCopy); + jlong * (JNICALL *GetLongArrayElements) + (JNIEnv *env, jlongArray array, jboolean *isCopy); + jfloat * (JNICALL *GetFloatArrayElements) + (JNIEnv *env, jfloatArray array, jboolean *isCopy); + jdouble * (JNICALL *GetDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jboolean *isCopy); + + void (JNICALL *ReleaseBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode); + void (JNICALL *ReleaseByteArrayElements) + (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode); + void (JNICALL *ReleaseCharArrayElements) + (JNIEnv *env, jcharArray array, jchar *elems, jint mode); + void (JNICALL *ReleaseShortArrayElements) + (JNIEnv *env, jshortArray array, jshort *elems, jint mode); + void (JNICALL *ReleaseIntArrayElements) + (JNIEnv *env, jintArray array, jint *elems, jint mode); + void (JNICALL *ReleaseLongArrayElements) + (JNIEnv *env, jlongArray array, jlong *elems, jint mode); + void (JNICALL *ReleaseFloatArrayElements) + (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode); + void (JNICALL *ReleaseDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode); + + void (JNICALL *GetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf); + void (JNICALL *GetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf); + void (JNICALL *GetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf); + void (JNICALL *GetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf); + void (JNICALL *GetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf); + void (JNICALL *GetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf); + void (JNICALL *GetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf); + void (JNICALL *GetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf); + + void (JNICALL *SetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf); + void (JNICALL *SetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf); + void (JNICALL *SetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf); + void (JNICALL *SetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf); + void (JNICALL *SetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf); + void (JNICALL *SetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf); + void (JNICALL *SetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf); + void (JNICALL *SetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf); + + jint (JNICALL *RegisterNatives) + (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, + jint nMethods); + jint (JNICALL *UnregisterNatives) + (JNIEnv *env, jclass clazz); + + jint (JNICALL *MonitorEnter) + (JNIEnv *env, jobject obj); + jint (JNICALL *MonitorExit) + (JNIEnv *env, jobject obj); + + jint (JNICALL *GetJavaVM) + (JNIEnv *env, JavaVM **vm); + + void (JNICALL *GetStringRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf); + void (JNICALL *GetStringUTFRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, char *buf); + + void * (JNICALL *GetPrimitiveArrayCritical) + (JNIEnv *env, jarray array, jboolean *isCopy); + void (JNICALL *ReleasePrimitiveArrayCritical) + (JNIEnv *env, jarray array, void *carray, jint mode); + + const jchar * (JNICALL *GetStringCritical) + (JNIEnv *env, jstring string, jboolean *isCopy); + void (JNICALL *ReleaseStringCritical) + (JNIEnv *env, jstring string, const jchar *cstring); + + jweak (JNICALL *NewWeakGlobalRef) + (JNIEnv *env, jobject obj); + void (JNICALL *DeleteWeakGlobalRef) + (JNIEnv *env, jweak ref); + + jboolean (JNICALL *ExceptionCheck) + (JNIEnv *env); + + jobject (JNICALL *NewDirectByteBuffer) + (JNIEnv* env, void* address, jlong capacity); + void* (JNICALL *GetDirectBufferAddress) + (JNIEnv* env, jobject buf); + jlong (JNICALL *GetDirectBufferCapacity) + (JNIEnv* env, jobject buf); + + /* New JNI 1.6 Features */ + + jobjectRefType (JNICALL *GetObjectRefType) + (JNIEnv* env, jobject obj); +}; + +/* + * We use inlined functions for C++ so that programmers can write: + * + * env->FindClass("java/lang/String") + * + * in C++ rather than: + * + * (*env)->FindClass(env, "java/lang/String") + * + * in C. + */ + +struct JNIEnv_ { + const struct JNINativeInterface_ *functions; +#ifdef __cplusplus + + jint GetVersion() { + return functions->GetVersion(this); + } + jclass DefineClass(const char *name, jobject loader, const jbyte *buf, + jsize len) { + return functions->DefineClass(this, name, loader, buf, len); + } + jclass FindClass(const char *name) { + return functions->FindClass(this, name); + } + jmethodID FromReflectedMethod(jobject method) { + return functions->FromReflectedMethod(this,method); + } + jfieldID FromReflectedField(jobject field) { + return functions->FromReflectedField(this,field); + } + + jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) { + return functions->ToReflectedMethod(this, cls, methodID, isStatic); + } + + jclass GetSuperclass(jclass sub) { + return functions->GetSuperclass(this, sub); + } + jboolean IsAssignableFrom(jclass sub, jclass sup) { + return functions->IsAssignableFrom(this, sub, sup); + } + + jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) { + return functions->ToReflectedField(this,cls,fieldID,isStatic); + } + + jint Throw(jthrowable obj) { + return functions->Throw(this, obj); + } + jint ThrowNew(jclass clazz, const char *msg) { + return functions->ThrowNew(this, clazz, msg); + } + jthrowable ExceptionOccurred() { + return functions->ExceptionOccurred(this); + } + void ExceptionDescribe() { + functions->ExceptionDescribe(this); + } + void ExceptionClear() { + functions->ExceptionClear(this); + } + void FatalError(const char *msg) { + functions->FatalError(this, msg); + } + + jint PushLocalFrame(jint capacity) { + return functions->PushLocalFrame(this,capacity); + } + jobject PopLocalFrame(jobject result) { + return functions->PopLocalFrame(this,result); + } + + jobject NewGlobalRef(jobject lobj) { + return functions->NewGlobalRef(this,lobj); + } + void DeleteGlobalRef(jobject gref) { + functions->DeleteGlobalRef(this,gref); + } + void DeleteLocalRef(jobject obj) { + functions->DeleteLocalRef(this, obj); + } + + jboolean IsSameObject(jobject obj1, jobject obj2) { + return functions->IsSameObject(this,obj1,obj2); + } + + jobject NewLocalRef(jobject ref) { + return functions->NewLocalRef(this,ref); + } + jint EnsureLocalCapacity(jint capacity) { + return functions->EnsureLocalCapacity(this,capacity); + } + + jobject AllocObject(jclass clazz) { + return functions->AllocObject(this,clazz); + } + jobject NewObject(jclass clazz, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args, methodID); + result = functions->NewObjectV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject NewObjectV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->NewObjectV(this,clazz,methodID,args); + } + jobject NewObjectA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->NewObjectA(this,clazz,methodID,args); + } + + jclass GetObjectClass(jobject obj) { + return functions->GetObjectClass(this,obj); + } + jboolean IsInstanceOf(jobject obj, jclass clazz) { + return functions->IsInstanceOf(this,obj,clazz); + } + + jmethodID GetMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetMethodID(this,clazz,name,sig); + } + + jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallObjectMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jobject CallObjectMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallObjectMethodV(this,obj,methodID,args); + } + jobject CallObjectMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallObjectMethodA(this,obj,methodID,args); + } + + jboolean CallBooleanMethod(jobject obj, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallBooleanMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallBooleanMethodV(this,obj,methodID,args); + } + jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallBooleanMethodA(this,obj,methodID, args); + } + + jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallByteMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jbyte CallByteMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallByteMethodV(this,obj,methodID,args); + } + jbyte CallByteMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallByteMethodA(this,obj,methodID,args); + } + + jchar CallCharMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallCharMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jchar CallCharMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallCharMethodV(this,obj,methodID,args); + } + jchar CallCharMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallCharMethodA(this,obj,methodID,args); + } + + jshort CallShortMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallShortMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jshort CallShortMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallShortMethodV(this,obj,methodID,args); + } + jshort CallShortMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallShortMethodA(this,obj,methodID,args); + } + + jint CallIntMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallIntMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jint CallIntMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallIntMethodV(this,obj,methodID,args); + } + jint CallIntMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallIntMethodA(this,obj,methodID,args); + } + + jlong CallLongMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallLongMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jlong CallLongMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallLongMethodV(this,obj,methodID,args); + } + jlong CallLongMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallLongMethodA(this,obj,methodID,args); + } + + jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallFloatMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jfloat CallFloatMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallFloatMethodV(this,obj,methodID,args); + } + jfloat CallFloatMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallFloatMethodA(this,obj,methodID,args); + } + + jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallDoubleMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallDoubleMethodV(this,obj,methodID,args); + } + jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallDoubleMethodA(this,obj,methodID,args); + } + + void CallVoidMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallVoidMethodV(this,obj,methodID,args); + va_end(args); + } + void CallVoidMethodV(jobject obj, jmethodID methodID, + va_list args) { + functions->CallVoidMethodV(this,obj,methodID,args); + } + void CallVoidMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + functions->CallVoidMethodA(this,obj,methodID,args); + } + + jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + } + jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualObjectMethodA(this,obj,clazz, + methodID,args); + } + + jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + } + jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualBooleanMethodA(this,obj,clazz, + methodID, args); + } + + jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + } + jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualByteMethodA(this,obj,clazz, + methodID,args); + } + + jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + } + jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualCharMethodA(this,obj,clazz, + methodID,args); + } + + jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + } + jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualShortMethodA(this,obj,clazz, + methodID,args); + } + + jint CallNonvirtualIntMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + } + jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualIntMethodA(this,obj,clazz, + methodID,args); + } + + jlong CallNonvirtualLongMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + } + jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualLongMethodA(this,obj,clazz, + methodID,args); + } + + jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + } + jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualFloatMethodA(this,obj,clazz, + methodID,args); + } + + jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + } + jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualDoubleMethodA(this,obj,clazz, + methodID,args); + } + + void CallNonvirtualVoidMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + va_end(args); + } + void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + } + void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args); + } + + jfieldID GetFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetFieldID(this,clazz,name,sig); + } + + jobject GetObjectField(jobject obj, jfieldID fieldID) { + return functions->GetObjectField(this,obj,fieldID); + } + jboolean GetBooleanField(jobject obj, jfieldID fieldID) { + return functions->GetBooleanField(this,obj,fieldID); + } + jbyte GetByteField(jobject obj, jfieldID fieldID) { + return functions->GetByteField(this,obj,fieldID); + } + jchar GetCharField(jobject obj, jfieldID fieldID) { + return functions->GetCharField(this,obj,fieldID); + } + jshort GetShortField(jobject obj, jfieldID fieldID) { + return functions->GetShortField(this,obj,fieldID); + } + jint GetIntField(jobject obj, jfieldID fieldID) { + return functions->GetIntField(this,obj,fieldID); + } + jlong GetLongField(jobject obj, jfieldID fieldID) { + return functions->GetLongField(this,obj,fieldID); + } + jfloat GetFloatField(jobject obj, jfieldID fieldID) { + return functions->GetFloatField(this,obj,fieldID); + } + jdouble GetDoubleField(jobject obj, jfieldID fieldID) { + return functions->GetDoubleField(this,obj,fieldID); + } + + void SetObjectField(jobject obj, jfieldID fieldID, jobject val) { + functions->SetObjectField(this,obj,fieldID,val); + } + void SetBooleanField(jobject obj, jfieldID fieldID, + jboolean val) { + functions->SetBooleanField(this,obj,fieldID,val); + } + void SetByteField(jobject obj, jfieldID fieldID, + jbyte val) { + functions->SetByteField(this,obj,fieldID,val); + } + void SetCharField(jobject obj, jfieldID fieldID, + jchar val) { + functions->SetCharField(this,obj,fieldID,val); + } + void SetShortField(jobject obj, jfieldID fieldID, + jshort val) { + functions->SetShortField(this,obj,fieldID,val); + } + void SetIntField(jobject obj, jfieldID fieldID, + jint val) { + functions->SetIntField(this,obj,fieldID,val); + } + void SetLongField(jobject obj, jfieldID fieldID, + jlong val) { + functions->SetLongField(this,obj,fieldID,val); + } + void SetFloatField(jobject obj, jfieldID fieldID, + jfloat val) { + functions->SetFloatField(this,obj,fieldID,val); + } + void SetDoubleField(jobject obj, jfieldID fieldID, + jdouble val) { + functions->SetDoubleField(this,obj,fieldID,val); + } + + jmethodID GetStaticMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticMethodID(this,clazz,name,sig); + } + + jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, + ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallStaticObjectMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->CallStaticObjectMethodV(this,clazz,methodID,args); + } + jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->CallStaticObjectMethodA(this,clazz,methodID,args); + } + + jboolean CallStaticBooleanMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jboolean CallStaticBooleanMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + } + jboolean CallStaticBooleanMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticBooleanMethodA(this,clazz,methodID,args); + } + + jbyte CallStaticByteMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallStaticByteMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jbyte CallStaticByteMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticByteMethodV(this,clazz,methodID,args); + } + jbyte CallStaticByteMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticByteMethodA(this,clazz,methodID,args); + } + + jchar CallStaticCharMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallStaticCharMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jchar CallStaticCharMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticCharMethodV(this,clazz,methodID,args); + } + jchar CallStaticCharMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticCharMethodA(this,clazz,methodID,args); + } + + jshort CallStaticShortMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallStaticShortMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jshort CallStaticShortMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticShortMethodV(this,clazz,methodID,args); + } + jshort CallStaticShortMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticShortMethodA(this,clazz,methodID,args); + } + + jint CallStaticIntMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallStaticIntMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jint CallStaticIntMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticIntMethodV(this,clazz,methodID,args); + } + jint CallStaticIntMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticIntMethodA(this,clazz,methodID,args); + } + + jlong CallStaticLongMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallStaticLongMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jlong CallStaticLongMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticLongMethodV(this,clazz,methodID,args); + } + jlong CallStaticLongMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticLongMethodA(this,clazz,methodID,args); + } + + jfloat CallStaticFloatMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallStaticFloatMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jfloat CallStaticFloatMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticFloatMethodV(this,clazz,methodID,args); + } + jfloat CallStaticFloatMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticFloatMethodA(this,clazz,methodID,args); + } + + jdouble CallStaticDoubleMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jdouble CallStaticDoubleMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + } + jdouble CallStaticDoubleMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticDoubleMethodA(this,clazz,methodID,args); + } + + void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallStaticVoidMethodV(this,cls,methodID,args); + va_end(args); + } + void CallStaticVoidMethodV(jclass cls, jmethodID methodID, + va_list args) { + functions->CallStaticVoidMethodV(this,cls,methodID,args); + } + void CallStaticVoidMethodA(jclass cls, jmethodID methodID, + const jvalue * args) { + functions->CallStaticVoidMethodA(this,cls,methodID,args); + } + + jfieldID GetStaticFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticFieldID(this,clazz,name,sig); + } + jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticObjectField(this,clazz,fieldID); + } + jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticBooleanField(this,clazz,fieldID); + } + jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticByteField(this,clazz,fieldID); + } + jchar GetStaticCharField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticCharField(this,clazz,fieldID); + } + jshort GetStaticShortField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticShortField(this,clazz,fieldID); + } + jint GetStaticIntField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticIntField(this,clazz,fieldID); + } + jlong GetStaticLongField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticLongField(this,clazz,fieldID); + } + jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticFloatField(this,clazz,fieldID); + } + jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticDoubleField(this,clazz,fieldID); + } + + void SetStaticObjectField(jclass clazz, jfieldID fieldID, + jobject value) { + functions->SetStaticObjectField(this,clazz,fieldID,value); + } + void SetStaticBooleanField(jclass clazz, jfieldID fieldID, + jboolean value) { + functions->SetStaticBooleanField(this,clazz,fieldID,value); + } + void SetStaticByteField(jclass clazz, jfieldID fieldID, + jbyte value) { + functions->SetStaticByteField(this,clazz,fieldID,value); + } + void SetStaticCharField(jclass clazz, jfieldID fieldID, + jchar value) { + functions->SetStaticCharField(this,clazz,fieldID,value); + } + void SetStaticShortField(jclass clazz, jfieldID fieldID, + jshort value) { + functions->SetStaticShortField(this,clazz,fieldID,value); + } + void SetStaticIntField(jclass clazz, jfieldID fieldID, + jint value) { + functions->SetStaticIntField(this,clazz,fieldID,value); + } + void SetStaticLongField(jclass clazz, jfieldID fieldID, + jlong value) { + functions->SetStaticLongField(this,clazz,fieldID,value); + } + void SetStaticFloatField(jclass clazz, jfieldID fieldID, + jfloat value) { + functions->SetStaticFloatField(this,clazz,fieldID,value); + } + void SetStaticDoubleField(jclass clazz, jfieldID fieldID, + jdouble value) { + functions->SetStaticDoubleField(this,clazz,fieldID,value); + } + + jstring NewString(const jchar *unicode, jsize len) { + return functions->NewString(this,unicode,len); + } + jsize GetStringLength(jstring str) { + return functions->GetStringLength(this,str); + } + const jchar *GetStringChars(jstring str, jboolean *isCopy) { + return functions->GetStringChars(this,str,isCopy); + } + void ReleaseStringChars(jstring str, const jchar *chars) { + functions->ReleaseStringChars(this,str,chars); + } + + jstring NewStringUTF(const char *utf) { + return functions->NewStringUTF(this,utf); + } + jsize GetStringUTFLength(jstring str) { + return functions->GetStringUTFLength(this,str); + } + const char* GetStringUTFChars(jstring str, jboolean *isCopy) { + return functions->GetStringUTFChars(this,str,isCopy); + } + void ReleaseStringUTFChars(jstring str, const char* chars) { + functions->ReleaseStringUTFChars(this,str,chars); + } + + jsize GetArrayLength(jarray array) { + return functions->GetArrayLength(this,array); + } + + jobjectArray NewObjectArray(jsize len, jclass clazz, + jobject init) { + return functions->NewObjectArray(this,len,clazz,init); + } + jobject GetObjectArrayElement(jobjectArray array, jsize index) { + return functions->GetObjectArrayElement(this,array,index); + } + void SetObjectArrayElement(jobjectArray array, jsize index, + jobject val) { + functions->SetObjectArrayElement(this,array,index,val); + } + + jbooleanArray NewBooleanArray(jsize len) { + return functions->NewBooleanArray(this,len); + } + jbyteArray NewByteArray(jsize len) { + return functions->NewByteArray(this,len); + } + jcharArray NewCharArray(jsize len) { + return functions->NewCharArray(this,len); + } + jshortArray NewShortArray(jsize len) { + return functions->NewShortArray(this,len); + } + jintArray NewIntArray(jsize len) { + return functions->NewIntArray(this,len); + } + jlongArray NewLongArray(jsize len) { + return functions->NewLongArray(this,len); + } + jfloatArray NewFloatArray(jsize len) { + return functions->NewFloatArray(this,len); + } + jdoubleArray NewDoubleArray(jsize len) { + return functions->NewDoubleArray(this,len); + } + + jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) { + return functions->GetBooleanArrayElements(this,array,isCopy); + } + jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) { + return functions->GetByteArrayElements(this,array,isCopy); + } + jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) { + return functions->GetCharArrayElements(this,array,isCopy); + } + jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) { + return functions->GetShortArrayElements(this,array,isCopy); + } + jint * GetIntArrayElements(jintArray array, jboolean *isCopy) { + return functions->GetIntArrayElements(this,array,isCopy); + } + jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) { + return functions->GetLongArrayElements(this,array,isCopy); + } + jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) { + return functions->GetFloatArrayElements(this,array,isCopy); + } + jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) { + return functions->GetDoubleArrayElements(this,array,isCopy); + } + + void ReleaseBooleanArrayElements(jbooleanArray array, + jboolean *elems, + jint mode) { + functions->ReleaseBooleanArrayElements(this,array,elems,mode); + } + void ReleaseByteArrayElements(jbyteArray array, + jbyte *elems, + jint mode) { + functions->ReleaseByteArrayElements(this,array,elems,mode); + } + void ReleaseCharArrayElements(jcharArray array, + jchar *elems, + jint mode) { + functions->ReleaseCharArrayElements(this,array,elems,mode); + } + void ReleaseShortArrayElements(jshortArray array, + jshort *elems, + jint mode) { + functions->ReleaseShortArrayElements(this,array,elems,mode); + } + void ReleaseIntArrayElements(jintArray array, + jint *elems, + jint mode) { + functions->ReleaseIntArrayElements(this,array,elems,mode); + } + void ReleaseLongArrayElements(jlongArray array, + jlong *elems, + jint mode) { + functions->ReleaseLongArrayElements(this,array,elems,mode); + } + void ReleaseFloatArrayElements(jfloatArray array, + jfloat *elems, + jint mode) { + functions->ReleaseFloatArrayElements(this,array,elems,mode); + } + void ReleaseDoubleArrayElements(jdoubleArray array, + jdouble *elems, + jint mode) { + functions->ReleaseDoubleArrayElements(this,array,elems,mode); + } + + void GetBooleanArrayRegion(jbooleanArray array, + jsize start, jsize len, jboolean *buf) { + functions->GetBooleanArrayRegion(this,array,start,len,buf); + } + void GetByteArrayRegion(jbyteArray array, + jsize start, jsize len, jbyte *buf) { + functions->GetByteArrayRegion(this,array,start,len,buf); + } + void GetCharArrayRegion(jcharArray array, + jsize start, jsize len, jchar *buf) { + functions->GetCharArrayRegion(this,array,start,len,buf); + } + void GetShortArrayRegion(jshortArray array, + jsize start, jsize len, jshort *buf) { + functions->GetShortArrayRegion(this,array,start,len,buf); + } + void GetIntArrayRegion(jintArray array, + jsize start, jsize len, jint *buf) { + functions->GetIntArrayRegion(this,array,start,len,buf); + } + void GetLongArrayRegion(jlongArray array, + jsize start, jsize len, jlong *buf) { + functions->GetLongArrayRegion(this,array,start,len,buf); + } + void GetFloatArrayRegion(jfloatArray array, + jsize start, jsize len, jfloat *buf) { + functions->GetFloatArrayRegion(this,array,start,len,buf); + } + void GetDoubleArrayRegion(jdoubleArray array, + jsize start, jsize len, jdouble *buf) { + functions->GetDoubleArrayRegion(this,array,start,len,buf); + } + + void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, + const jboolean *buf) { + functions->SetBooleanArrayRegion(this,array,start,len,buf); + } + void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, + const jbyte *buf) { + functions->SetByteArrayRegion(this,array,start,len,buf); + } + void SetCharArrayRegion(jcharArray array, jsize start, jsize len, + const jchar *buf) { + functions->SetCharArrayRegion(this,array,start,len,buf); + } + void SetShortArrayRegion(jshortArray array, jsize start, jsize len, + const jshort *buf) { + functions->SetShortArrayRegion(this,array,start,len,buf); + } + void SetIntArrayRegion(jintArray array, jsize start, jsize len, + const jint *buf) { + functions->SetIntArrayRegion(this,array,start,len,buf); + } + void SetLongArrayRegion(jlongArray array, jsize start, jsize len, + const jlong *buf) { + functions->SetLongArrayRegion(this,array,start,len,buf); + } + void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, + const jfloat *buf) { + functions->SetFloatArrayRegion(this,array,start,len,buf); + } + void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, + const jdouble *buf) { + functions->SetDoubleArrayRegion(this,array,start,len,buf); + } + + jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, + jint nMethods) { + return functions->RegisterNatives(this,clazz,methods,nMethods); + } + jint UnregisterNatives(jclass clazz) { + return functions->UnregisterNatives(this,clazz); + } + + jint MonitorEnter(jobject obj) { + return functions->MonitorEnter(this,obj); + } + jint MonitorExit(jobject obj) { + return functions->MonitorExit(this,obj); + } + + jint GetJavaVM(JavaVM **vm) { + return functions->GetJavaVM(this,vm); + } + + void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { + functions->GetStringRegion(this,str,start,len,buf); + } + void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { + functions->GetStringUTFRegion(this,str,start,len,buf); + } + + void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) { + return functions->GetPrimitiveArrayCritical(this,array,isCopy); + } + void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) { + functions->ReleasePrimitiveArrayCritical(this,array,carray,mode); + } + + const jchar * GetStringCritical(jstring string, jboolean *isCopy) { + return functions->GetStringCritical(this,string,isCopy); + } + void ReleaseStringCritical(jstring string, const jchar *cstring) { + functions->ReleaseStringCritical(this,string,cstring); + } + + jweak NewWeakGlobalRef(jobject obj) { + return functions->NewWeakGlobalRef(this,obj); + } + void DeleteWeakGlobalRef(jweak ref) { + functions->DeleteWeakGlobalRef(this,ref); + } + + jboolean ExceptionCheck() { + return functions->ExceptionCheck(this); + } + + jobject NewDirectByteBuffer(void* address, jlong capacity) { + return functions->NewDirectByteBuffer(this, address, capacity); + } + void* GetDirectBufferAddress(jobject buf) { + return functions->GetDirectBufferAddress(this, buf); + } + jlong GetDirectBufferCapacity(jobject buf) { + return functions->GetDirectBufferCapacity(this, buf); + } + jobjectRefType GetObjectRefType(jobject obj) { + return functions->GetObjectRefType(this, obj); + } + +#endif /* __cplusplus */ +}; + +typedef struct JavaVMOption { + char *optionString; + void *extraInfo; +} JavaVMOption; + +typedef struct JavaVMInitArgs { + jint version; + + jint nOptions; + JavaVMOption *options; + jboolean ignoreUnrecognized; +} JavaVMInitArgs; + +typedef struct JavaVMAttachArgs { + jint version; + + char *name; + jobject group; +} JavaVMAttachArgs; + +/* These will be VM-specific. */ + +#define JDK1_2 +#define JDK1_4 + +/* End VM-specific. */ + +struct JNIInvokeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + + jint (JNICALL *DestroyJavaVM)(JavaVM *vm); + + jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args); + + jint (JNICALL *DetachCurrentThread)(JavaVM *vm); + + jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version); + + jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args); +}; + +struct JavaVM_ { + const struct JNIInvokeInterface_ *functions; +#ifdef __cplusplus + + jint DestroyJavaVM() { + return functions->DestroyJavaVM(this); + } + jint AttachCurrentThread(void **penv, void *args) { + return functions->AttachCurrentThread(this, penv, args); + } + jint DetachCurrentThread() { + return functions->DetachCurrentThread(this); + } + + jint GetEnv(void **penv, jint version) { + return functions->GetEnv(this, penv, version); + } + jint AttachCurrentThreadAsDaemon(void **penv, void *args) { + return functions->AttachCurrentThreadAsDaemon(this, penv, args); + } +#endif +}; + +#ifdef _JNI_IMPLEMENTATION_ +#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT +#else +#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT +#endif +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_GetDefaultJavaVMInitArgs(void *args); + +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args); + +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); + +/* Defined by native libraries. */ +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM *vm, void *reserved); + +JNIEXPORT void JNICALL +JNI_OnUnload(JavaVM *vm, void *reserved); + +#define JNI_VERSION_1_1 0x00010001 +#define JNI_VERSION_1_2 0x00010002 +#define JNI_VERSION_1_4 0x00010004 +#define JNI_VERSION_1_6 0x00010006 + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !_JAVASOFT_JNI_H_ */ diff --git a/jansi/src/main/lib/inc_linux/jni_md.h b/jansi/src/main/lib/inc_linux/jni_md.h new file mode 100644 index 00000000..9b5d1a8a --- /dev/null +++ b/jansi/src/main/lib/inc_linux/jni_md.h @@ -0,0 +1,24 @@ +/* + * %W% %E% + * + * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +#ifndef _JAVASOFT_JNI_MD_H_ +#define _JAVASOFT_JNI_MD_H_ + +#define JNIEXPORT __attribute__((__visibility__("default"))) +#define JNIIMPORT +#define JNICALL + +typedef int jint; +#ifdef _LP64 /* 64-bit Solaris */ +typedef long jlong; +#else +typedef long long jlong; +#endif + +typedef signed char jbyte; + +#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/jansi/src/main/lib/inc_mac/jni.h b/jansi/src/main/lib/inc_mac/jni.h new file mode 100644 index 00000000..cff1a02f --- /dev/null +++ b/jansi/src/main/lib/inc_mac/jni.h @@ -0,0 +1,1961 @@ +/* + * @(#)jni.h 1.62 06/02/02 + * + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +/* + * We used part of Netscape's Java Runtime Interface (JRI) as the starting + * point of our design and implementation. + */ + +/****************************************************************************** + * Java Runtime Interface + * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved. + *****************************************************************************/ + +#ifndef _JAVASOFT_JNI_H_ +#define _JAVASOFT_JNI_H_ + +#include +#include + +/* jni_md.h contains the machine-dependent typedefs for jbyte, jint + and jlong */ + +#include "jni_md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * JNI Types + */ + +#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H + +typedef unsigned char jboolean; +typedef unsigned short jchar; +typedef short jshort; +typedef float jfloat; +typedef double jdouble; + +typedef jint jsize; + +#ifdef __cplusplus + +class _jobject {}; +class _jclass : public _jobject {}; +class _jthrowable : public _jobject {}; +class _jstring : public _jobject {}; +class _jarray : public _jobject {}; +class _jbooleanArray : public _jarray {}; +class _jbyteArray : public _jarray {}; +class _jcharArray : public _jarray {}; +class _jshortArray : public _jarray {}; +class _jintArray : public _jarray {}; +class _jlongArray : public _jarray {}; +class _jfloatArray : public _jarray {}; +class _jdoubleArray : public _jarray {}; +class _jobjectArray : public _jarray {}; + +typedef _jobject *jobject; +typedef _jclass *jclass; +typedef _jthrowable *jthrowable; +typedef _jstring *jstring; +typedef _jarray *jarray; +typedef _jbooleanArray *jbooleanArray; +typedef _jbyteArray *jbyteArray; +typedef _jcharArray *jcharArray; +typedef _jshortArray *jshortArray; +typedef _jintArray *jintArray; +typedef _jlongArray *jlongArray; +typedef _jfloatArray *jfloatArray; +typedef _jdoubleArray *jdoubleArray; +typedef _jobjectArray *jobjectArray; + +#else + +struct _jobject; + +typedef struct _jobject *jobject; +typedef jobject jclass; +typedef jobject jthrowable; +typedef jobject jstring; +typedef jobject jarray; +typedef jarray jbooleanArray; +typedef jarray jbyteArray; +typedef jarray jcharArray; +typedef jarray jshortArray; +typedef jarray jintArray; +typedef jarray jlongArray; +typedef jarray jfloatArray; +typedef jarray jdoubleArray; +typedef jarray jobjectArray; + +#endif + +typedef jobject jweak; + +typedef union jvalue { + jboolean z; + jbyte b; + jchar c; + jshort s; + jint i; + jlong j; + jfloat f; + jdouble d; + jobject l; +} jvalue; + +struct _jfieldID; +typedef struct _jfieldID *jfieldID; + +struct _jmethodID; +typedef struct _jmethodID *jmethodID; + +/* Return values from jobjectRefType */ +typedef enum _jobjectType { + JNIInvalidRefType = 0, + JNILocalRefType = 1, + JNIGlobalRefType = 2, + JNIWeakGlobalRefType = 3 +} jobjectRefType; + + +#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */ + +/* + * jboolean constants + */ + +#define JNI_FALSE 0 +#define JNI_TRUE 1 + +/* + * possible return values for JNI functions. + */ + +#define JNI_OK 0 /* success */ +#define JNI_ERR (-1) /* unknown error */ +#define JNI_EDETACHED (-2) /* thread detached from the VM */ +#define JNI_EVERSION (-3) /* JNI version error */ +#define JNI_ENOMEM (-4) /* not enough memory */ +#define JNI_EEXIST (-5) /* VM already created */ +#define JNI_EINVAL (-6) /* invalid arguments */ + +/* + * used in ReleaseScalarArrayElements + */ + +#define JNI_COMMIT 1 +#define JNI_ABORT 2 + +/* + * used in RegisterNatives to describe native method name, signature, + * and function pointer. + */ + +typedef struct { + char *name; + char *signature; + void *fnPtr; +} JNINativeMethod; + +/* + * JNI Native Method Interface. + */ + +struct JNINativeInterface_; + +struct JNIEnv_; + +#ifdef __cplusplus +typedef JNIEnv_ JNIEnv; +#else +typedef const struct JNINativeInterface_ *JNIEnv; +#endif + +/* + * JNI Invocation Interface. + */ + +struct JNIInvokeInterface_; + +struct JavaVM_; + +#ifdef __cplusplus +typedef JavaVM_ JavaVM; +#else +typedef const struct JNIInvokeInterface_ *JavaVM; +#endif + +struct JNINativeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + + void *reserved3; + +#if !TARGET_RT_MAC_CFM && defined(__ppc__) + void* cfm_vectors[225]; +#endif /* !TARGET_RT_MAC_CFM && defined(__ppc__) */ + + jint (JNICALL *GetVersion)(JNIEnv *env); + + jclass (JNICALL *DefineClass) + (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, + jsize len); + jclass (JNICALL *FindClass) + (JNIEnv *env, const char *name); + + jmethodID (JNICALL *FromReflectedMethod) + (JNIEnv *env, jobject method); + jfieldID (JNICALL *FromReflectedField) + (JNIEnv *env, jobject field); + + jobject (JNICALL *ToReflectedMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic); + + jclass (JNICALL *GetSuperclass) + (JNIEnv *env, jclass sub); + jboolean (JNICALL *IsAssignableFrom) + (JNIEnv *env, jclass sub, jclass sup); + + jobject (JNICALL *ToReflectedField) + (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic); + + jint (JNICALL *Throw) + (JNIEnv *env, jthrowable obj); + jint (JNICALL *ThrowNew) + (JNIEnv *env, jclass clazz, const char *msg); + jthrowable (JNICALL *ExceptionOccurred) + (JNIEnv *env); + void (JNICALL *ExceptionDescribe) + (JNIEnv *env); + void (JNICALL *ExceptionClear) + (JNIEnv *env); + void (JNICALL *FatalError) + (JNIEnv *env, const char *msg); + + jint (JNICALL *PushLocalFrame) + (JNIEnv *env, jint capacity); + jobject (JNICALL *PopLocalFrame) + (JNIEnv *env, jobject result); + + jobject (JNICALL *NewGlobalRef) + (JNIEnv *env, jobject lobj); + void (JNICALL *DeleteGlobalRef) + (JNIEnv *env, jobject gref); + void (JNICALL *DeleteLocalRef) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsSameObject) + (JNIEnv *env, jobject obj1, jobject obj2); + jobject (JNICALL *NewLocalRef) + (JNIEnv *env, jobject ref); + jint (JNICALL *EnsureLocalCapacity) + (JNIEnv *env, jint capacity); + + jobject (JNICALL *AllocObject) + (JNIEnv *env, jclass clazz); + jobject (JNICALL *NewObject) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *NewObjectV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *NewObjectA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jclass (JNICALL *GetObjectClass) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsInstanceOf) + (JNIEnv *env, jobject obj, jclass clazz); + + jmethodID (JNICALL *GetMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallObjectMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jobject (JNICALL *CallObjectMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jobject (JNICALL *CallObjectMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jboolean (JNICALL *CallBooleanMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jboolean (JNICALL *CallBooleanMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jboolean (JNICALL *CallBooleanMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jbyte (JNICALL *CallByteMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jbyte (JNICALL *CallByteMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jbyte (JNICALL *CallByteMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallCharMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jchar (JNICALL *CallCharMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jchar (JNICALL *CallCharMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallShortMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jshort (JNICALL *CallShortMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jshort (JNICALL *CallShortMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallIntMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jint (JNICALL *CallIntMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jint (JNICALL *CallIntMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallLongMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jlong (JNICALL *CallLongMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jlong (JNICALL *CallLongMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallFloatMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jfloat (JNICALL *CallFloatMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jfloat (JNICALL *CallFloatMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallDoubleMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jdouble (JNICALL *CallDoubleMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jdouble (JNICALL *CallDoubleMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallVoidMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + void (JNICALL *CallVoidMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + void (JNICALL *CallVoidMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jobject (JNICALL *CallNonvirtualObjectMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallNonvirtualObjectMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jobject (JNICALL *CallNonvirtualObjectMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jboolean (JNICALL *CallNonvirtualBooleanMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallNonvirtualBooleanMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jboolean (JNICALL *CallNonvirtualBooleanMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jbyte (JNICALL *CallNonvirtualByteMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallNonvirtualByteMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jbyte (JNICALL *CallNonvirtualByteMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jchar (JNICALL *CallNonvirtualCharMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallNonvirtualCharMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jchar (JNICALL *CallNonvirtualCharMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jshort (JNICALL *CallNonvirtualShortMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallNonvirtualShortMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jshort (JNICALL *CallNonvirtualShortMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jint (JNICALL *CallNonvirtualIntMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallNonvirtualIntMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jint (JNICALL *CallNonvirtualIntMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jlong (JNICALL *CallNonvirtualLongMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallNonvirtualLongMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jlong (JNICALL *CallNonvirtualLongMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jfloat (JNICALL *CallNonvirtualFloatMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallNonvirtualFloatMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jfloat (JNICALL *CallNonvirtualFloatMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jdouble (JNICALL *CallNonvirtualDoubleMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallNonvirtualDoubleMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jdouble (JNICALL *CallNonvirtualDoubleMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + void (JNICALL *CallNonvirtualVoidMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + void (JNICALL *CallNonvirtualVoidMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + void (JNICALL *CallNonvirtualVoidMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jfieldID (JNICALL *GetFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *GetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jboolean (JNICALL *GetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jbyte (JNICALL *GetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jchar (JNICALL *GetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jshort (JNICALL *GetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jint (JNICALL *GetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jlong (JNICALL *GetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jfloat (JNICALL *GetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jdouble (JNICALL *GetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + + void (JNICALL *SetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val); + void (JNICALL *SetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val); + void (JNICALL *SetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val); + void (JNICALL *SetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val); + void (JNICALL *SetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val); + void (JNICALL *SetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jint val); + void (JNICALL *SetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val); + void (JNICALL *SetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val); + void (JNICALL *SetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val); + + jmethodID (JNICALL *GetStaticMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallStaticObjectMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallStaticObjectMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *CallStaticObjectMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jboolean (JNICALL *CallStaticBooleanMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallStaticBooleanMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jboolean (JNICALL *CallStaticBooleanMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jbyte (JNICALL *CallStaticByteMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallStaticByteMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jbyte (JNICALL *CallStaticByteMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallStaticCharMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallStaticCharMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jchar (JNICALL *CallStaticCharMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallStaticShortMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallStaticShortMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jshort (JNICALL *CallStaticShortMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallStaticIntMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallStaticIntMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jint (JNICALL *CallStaticIntMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallStaticLongMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallStaticLongMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jlong (JNICALL *CallStaticLongMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallStaticFloatMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallStaticFloatMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jfloat (JNICALL *CallStaticFloatMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallStaticDoubleMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallStaticDoubleMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jdouble (JNICALL *CallStaticDoubleMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallStaticVoidMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, ...); + void (JNICALL *CallStaticVoidMethodV) + (JNIEnv *env, jclass cls, jmethodID methodID, va_list args); + void (JNICALL *CallStaticVoidMethodA) + (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args); + + jfieldID (JNICALL *GetStaticFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + jobject (JNICALL *GetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jboolean (JNICALL *GetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jbyte (JNICALL *GetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jchar (JNICALL *GetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jshort (JNICALL *GetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jint (JNICALL *GetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jlong (JNICALL *GetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jfloat (JNICALL *GetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jdouble (JNICALL *GetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + + void (JNICALL *SetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value); + void (JNICALL *SetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value); + void (JNICALL *SetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value); + void (JNICALL *SetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value); + void (JNICALL *SetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value); + void (JNICALL *SetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value); + void (JNICALL *SetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value); + void (JNICALL *SetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value); + void (JNICALL *SetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value); + + jstring (JNICALL *NewString) + (JNIEnv *env, const jchar *unicode, jsize len); + jsize (JNICALL *GetStringLength) + (JNIEnv *env, jstring str); + const jchar *(JNICALL *GetStringChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringChars) + (JNIEnv *env, jstring str, const jchar *chars); + + jstring (JNICALL *NewStringUTF) + (JNIEnv *env, const char *utf); + jsize (JNICALL *GetStringUTFLength) + (JNIEnv *env, jstring str); + const char* (JNICALL *GetStringUTFChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringUTFChars) + (JNIEnv *env, jstring str, const char* chars); + + + jsize (JNICALL *GetArrayLength) + (JNIEnv *env, jarray array); + + jobjectArray (JNICALL *NewObjectArray) + (JNIEnv *env, jsize len, jclass clazz, jobject init); + jobject (JNICALL *GetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index); + void (JNICALL *SetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index, jobject val); + + jbooleanArray (JNICALL *NewBooleanArray) + (JNIEnv *env, jsize len); + jbyteArray (JNICALL *NewByteArray) + (JNIEnv *env, jsize len); + jcharArray (JNICALL *NewCharArray) + (JNIEnv *env, jsize len); + jshortArray (JNICALL *NewShortArray) + (JNIEnv *env, jsize len); + jintArray (JNICALL *NewIntArray) + (JNIEnv *env, jsize len); + jlongArray (JNICALL *NewLongArray) + (JNIEnv *env, jsize len); + jfloatArray (JNICALL *NewFloatArray) + (JNIEnv *env, jsize len); + jdoubleArray (JNICALL *NewDoubleArray) + (JNIEnv *env, jsize len); + + jboolean * (JNICALL *GetBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *isCopy); + jbyte * (JNICALL *GetByteArrayElements) + (JNIEnv *env, jbyteArray array, jboolean *isCopy); + jchar * (JNICALL *GetCharArrayElements) + (JNIEnv *env, jcharArray array, jboolean *isCopy); + jshort * (JNICALL *GetShortArrayElements) + (JNIEnv *env, jshortArray array, jboolean *isCopy); + jint * (JNICALL *GetIntArrayElements) + (JNIEnv *env, jintArray array, jboolean *isCopy); + jlong * (JNICALL *GetLongArrayElements) + (JNIEnv *env, jlongArray array, jboolean *isCopy); + jfloat * (JNICALL *GetFloatArrayElements) + (JNIEnv *env, jfloatArray array, jboolean *isCopy); + jdouble * (JNICALL *GetDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jboolean *isCopy); + + void (JNICALL *ReleaseBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode); + void (JNICALL *ReleaseByteArrayElements) + (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode); + void (JNICALL *ReleaseCharArrayElements) + (JNIEnv *env, jcharArray array, jchar *elems, jint mode); + void (JNICALL *ReleaseShortArrayElements) + (JNIEnv *env, jshortArray array, jshort *elems, jint mode); + void (JNICALL *ReleaseIntArrayElements) + (JNIEnv *env, jintArray array, jint *elems, jint mode); + void (JNICALL *ReleaseLongArrayElements) + (JNIEnv *env, jlongArray array, jlong *elems, jint mode); + void (JNICALL *ReleaseFloatArrayElements) + (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode); + void (JNICALL *ReleaseDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode); + + void (JNICALL *GetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf); + void (JNICALL *GetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf); + void (JNICALL *GetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf); + void (JNICALL *GetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf); + void (JNICALL *GetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf); + void (JNICALL *GetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf); + void (JNICALL *GetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf); + void (JNICALL *GetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf); + + void (JNICALL *SetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf); + void (JNICALL *SetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf); + void (JNICALL *SetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf); + void (JNICALL *SetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf); + void (JNICALL *SetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf); + void (JNICALL *SetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf); + void (JNICALL *SetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf); + void (JNICALL *SetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf); + + jint (JNICALL *RegisterNatives) + (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, + jint nMethods); + jint (JNICALL *UnregisterNatives) + (JNIEnv *env, jclass clazz); + + jint (JNICALL *MonitorEnter) + (JNIEnv *env, jobject obj); + jint (JNICALL *MonitorExit) + (JNIEnv *env, jobject obj); + + jint (JNICALL *GetJavaVM) + (JNIEnv *env, JavaVM **vm); + + void (JNICALL *GetStringRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf); + void (JNICALL *GetStringUTFRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, char *buf); + + void * (JNICALL *GetPrimitiveArrayCritical) + (JNIEnv *env, jarray array, jboolean *isCopy); + void (JNICALL *ReleasePrimitiveArrayCritical) + (JNIEnv *env, jarray array, void *carray, jint mode); + + const jchar * (JNICALL *GetStringCritical) + (JNIEnv *env, jstring string, jboolean *isCopy); + void (JNICALL *ReleaseStringCritical) + (JNIEnv *env, jstring string, const jchar *cstring); + + jweak (JNICALL *NewWeakGlobalRef) + (JNIEnv *env, jobject obj); + void (JNICALL *DeleteWeakGlobalRef) + (JNIEnv *env, jweak ref); + + jboolean (JNICALL *ExceptionCheck) + (JNIEnv *env); + + jobject (JNICALL *NewDirectByteBuffer) + (JNIEnv* env, void* address, jlong capacity); + void* (JNICALL *GetDirectBufferAddress) + (JNIEnv* env, jobject buf); + jlong (JNICALL *GetDirectBufferCapacity) + (JNIEnv* env, jobject buf); + + /* New JNI 1.6 Features */ + + jobjectRefType (JNICALL *GetObjectRefType) + (JNIEnv* env, jobject obj); + + #if TARGET_RT_MAC_CFM && defined(__ppc__) + void* real_functions[228]; + #endif /* TARGET_RT_MAC_CFM && defined(__ppc__) */ +}; + +/* + * We use inlined functions for C++ so that programmers can write: + * + * env->FindClass("java/lang/String") + * + * in C++ rather than: + * + * (*env)->FindClass(env, "java/lang/String") + * + * in C. + */ + +struct JNIEnv_ { + const struct JNINativeInterface_ *functions; +#ifdef __cplusplus + + jint GetVersion() { + return functions->GetVersion(this); + } + jclass DefineClass(const char *name, jobject loader, const jbyte *buf, + jsize len) { + return functions->DefineClass(this, name, loader, buf, len); + } + jclass FindClass(const char *name) { + return functions->FindClass(this, name); + } + jmethodID FromReflectedMethod(jobject method) { + return functions->FromReflectedMethod(this,method); + } + jfieldID FromReflectedField(jobject field) { + return functions->FromReflectedField(this,field); + } + + jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) { + return functions->ToReflectedMethod(this, cls, methodID, isStatic); + } + + jclass GetSuperclass(jclass sub) { + return functions->GetSuperclass(this, sub); + } + jboolean IsAssignableFrom(jclass sub, jclass sup) { + return functions->IsAssignableFrom(this, sub, sup); + } + + jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) { + return functions->ToReflectedField(this,cls,fieldID,isStatic); + } + + jint Throw(jthrowable obj) { + return functions->Throw(this, obj); + } + jint ThrowNew(jclass clazz, const char *msg) { + return functions->ThrowNew(this, clazz, msg); + } + jthrowable ExceptionOccurred() { + return functions->ExceptionOccurred(this); + } + void ExceptionDescribe() { + functions->ExceptionDescribe(this); + } + void ExceptionClear() { + functions->ExceptionClear(this); + } + void FatalError(const char *msg) { + functions->FatalError(this, msg); + } + + jint PushLocalFrame(jint capacity) { + return functions->PushLocalFrame(this,capacity); + } + jobject PopLocalFrame(jobject result) { + return functions->PopLocalFrame(this,result); + } + + jobject NewGlobalRef(jobject lobj) { + return functions->NewGlobalRef(this,lobj); + } + void DeleteGlobalRef(jobject gref) { + functions->DeleteGlobalRef(this,gref); + } + void DeleteLocalRef(jobject obj) { + functions->DeleteLocalRef(this, obj); + } + + jboolean IsSameObject(jobject obj1, jobject obj2) { + return functions->IsSameObject(this,obj1,obj2); + } + + jobject NewLocalRef(jobject ref) { + return functions->NewLocalRef(this,ref); + } + jint EnsureLocalCapacity(jint capacity) { + return functions->EnsureLocalCapacity(this,capacity); + } + + jobject AllocObject(jclass clazz) { + return functions->AllocObject(this,clazz); + } + jobject NewObject(jclass clazz, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args, methodID); + result = functions->NewObjectV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject NewObjectV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->NewObjectV(this,clazz,methodID,args); + } + jobject NewObjectA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->NewObjectA(this,clazz,methodID,args); + } + + jclass GetObjectClass(jobject obj) { + return functions->GetObjectClass(this,obj); + } + jboolean IsInstanceOf(jobject obj, jclass clazz) { + return functions->IsInstanceOf(this,obj,clazz); + } + + jmethodID GetMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetMethodID(this,clazz,name,sig); + } + + jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallObjectMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jobject CallObjectMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallObjectMethodV(this,obj,methodID,args); + } + jobject CallObjectMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallObjectMethodA(this,obj,methodID,args); + } + + jboolean CallBooleanMethod(jobject obj, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallBooleanMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallBooleanMethodV(this,obj,methodID,args); + } + jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallBooleanMethodA(this,obj,methodID, args); + } + + jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallByteMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jbyte CallByteMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallByteMethodV(this,obj,methodID,args); + } + jbyte CallByteMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallByteMethodA(this,obj,methodID,args); + } + + jchar CallCharMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallCharMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jchar CallCharMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallCharMethodV(this,obj,methodID,args); + } + jchar CallCharMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallCharMethodA(this,obj,methodID,args); + } + + jshort CallShortMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallShortMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jshort CallShortMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallShortMethodV(this,obj,methodID,args); + } + jshort CallShortMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallShortMethodA(this,obj,methodID,args); + } + + jint CallIntMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallIntMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jint CallIntMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallIntMethodV(this,obj,methodID,args); + } + jint CallIntMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallIntMethodA(this,obj,methodID,args); + } + + jlong CallLongMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallLongMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jlong CallLongMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallLongMethodV(this,obj,methodID,args); + } + jlong CallLongMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallLongMethodA(this,obj,methodID,args); + } + + jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallFloatMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jfloat CallFloatMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallFloatMethodV(this,obj,methodID,args); + } + jfloat CallFloatMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallFloatMethodA(this,obj,methodID,args); + } + + jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallDoubleMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallDoubleMethodV(this,obj,methodID,args); + } + jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallDoubleMethodA(this,obj,methodID,args); + } + + void CallVoidMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallVoidMethodV(this,obj,methodID,args); + va_end(args); + } + void CallVoidMethodV(jobject obj, jmethodID methodID, + va_list args) { + functions->CallVoidMethodV(this,obj,methodID,args); + } + void CallVoidMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + functions->CallVoidMethodA(this,obj,methodID,args); + } + + jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + } + jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualObjectMethodA(this,obj,clazz, + methodID,args); + } + + jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + } + jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualBooleanMethodA(this,obj,clazz, + methodID, args); + } + + jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + } + jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualByteMethodA(this,obj,clazz, + methodID,args); + } + + jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + } + jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualCharMethodA(this,obj,clazz, + methodID,args); + } + + jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + } + jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualShortMethodA(this,obj,clazz, + methodID,args); + } + + jint CallNonvirtualIntMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + } + jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualIntMethodA(this,obj,clazz, + methodID,args); + } + + jlong CallNonvirtualLongMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + } + jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualLongMethodA(this,obj,clazz, + methodID,args); + } + + jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + } + jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualFloatMethodA(this,obj,clazz, + methodID,args); + } + + jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + } + jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualDoubleMethodA(this,obj,clazz, + methodID,args); + } + + void CallNonvirtualVoidMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + va_end(args); + } + void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + } + void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args); + } + + jfieldID GetFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetFieldID(this,clazz,name,sig); + } + + jobject GetObjectField(jobject obj, jfieldID fieldID) { + return functions->GetObjectField(this,obj,fieldID); + } + jboolean GetBooleanField(jobject obj, jfieldID fieldID) { + return functions->GetBooleanField(this,obj,fieldID); + } + jbyte GetByteField(jobject obj, jfieldID fieldID) { + return functions->GetByteField(this,obj,fieldID); + } + jchar GetCharField(jobject obj, jfieldID fieldID) { + return functions->GetCharField(this,obj,fieldID); + } + jshort GetShortField(jobject obj, jfieldID fieldID) { + return functions->GetShortField(this,obj,fieldID); + } + jint GetIntField(jobject obj, jfieldID fieldID) { + return functions->GetIntField(this,obj,fieldID); + } + jlong GetLongField(jobject obj, jfieldID fieldID) { + return functions->GetLongField(this,obj,fieldID); + } + jfloat GetFloatField(jobject obj, jfieldID fieldID) { + return functions->GetFloatField(this,obj,fieldID); + } + jdouble GetDoubleField(jobject obj, jfieldID fieldID) { + return functions->GetDoubleField(this,obj,fieldID); + } + + void SetObjectField(jobject obj, jfieldID fieldID, jobject val) { + functions->SetObjectField(this,obj,fieldID,val); + } + void SetBooleanField(jobject obj, jfieldID fieldID, + jboolean val) { + functions->SetBooleanField(this,obj,fieldID,val); + } + void SetByteField(jobject obj, jfieldID fieldID, + jbyte val) { + functions->SetByteField(this,obj,fieldID,val); + } + void SetCharField(jobject obj, jfieldID fieldID, + jchar val) { + functions->SetCharField(this,obj,fieldID,val); + } + void SetShortField(jobject obj, jfieldID fieldID, + jshort val) { + functions->SetShortField(this,obj,fieldID,val); + } + void SetIntField(jobject obj, jfieldID fieldID, + jint val) { + functions->SetIntField(this,obj,fieldID,val); + } + void SetLongField(jobject obj, jfieldID fieldID, + jlong val) { + functions->SetLongField(this,obj,fieldID,val); + } + void SetFloatField(jobject obj, jfieldID fieldID, + jfloat val) { + functions->SetFloatField(this,obj,fieldID,val); + } + void SetDoubleField(jobject obj, jfieldID fieldID, + jdouble val) { + functions->SetDoubleField(this,obj,fieldID,val); + } + + jmethodID GetStaticMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticMethodID(this,clazz,name,sig); + } + + jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, + ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallStaticObjectMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->CallStaticObjectMethodV(this,clazz,methodID,args); + } + jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->CallStaticObjectMethodA(this,clazz,methodID,args); + } + + jboolean CallStaticBooleanMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jboolean CallStaticBooleanMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + } + jboolean CallStaticBooleanMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticBooleanMethodA(this,clazz,methodID,args); + } + + jbyte CallStaticByteMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallStaticByteMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jbyte CallStaticByteMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticByteMethodV(this,clazz,methodID,args); + } + jbyte CallStaticByteMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticByteMethodA(this,clazz,methodID,args); + } + + jchar CallStaticCharMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallStaticCharMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jchar CallStaticCharMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticCharMethodV(this,clazz,methodID,args); + } + jchar CallStaticCharMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticCharMethodA(this,clazz,methodID,args); + } + + jshort CallStaticShortMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallStaticShortMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jshort CallStaticShortMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticShortMethodV(this,clazz,methodID,args); + } + jshort CallStaticShortMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticShortMethodA(this,clazz,methodID,args); + } + + jint CallStaticIntMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallStaticIntMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jint CallStaticIntMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticIntMethodV(this,clazz,methodID,args); + } + jint CallStaticIntMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticIntMethodA(this,clazz,methodID,args); + } + + jlong CallStaticLongMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallStaticLongMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jlong CallStaticLongMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticLongMethodV(this,clazz,methodID,args); + } + jlong CallStaticLongMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticLongMethodA(this,clazz,methodID,args); + } + + jfloat CallStaticFloatMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallStaticFloatMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jfloat CallStaticFloatMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticFloatMethodV(this,clazz,methodID,args); + } + jfloat CallStaticFloatMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticFloatMethodA(this,clazz,methodID,args); + } + + jdouble CallStaticDoubleMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jdouble CallStaticDoubleMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + } + jdouble CallStaticDoubleMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticDoubleMethodA(this,clazz,methodID,args); + } + + void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallStaticVoidMethodV(this,cls,methodID,args); + va_end(args); + } + void CallStaticVoidMethodV(jclass cls, jmethodID methodID, + va_list args) { + functions->CallStaticVoidMethodV(this,cls,methodID,args); + } + void CallStaticVoidMethodA(jclass cls, jmethodID methodID, + const jvalue * args) { + functions->CallStaticVoidMethodA(this,cls,methodID,args); + } + + jfieldID GetStaticFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticFieldID(this,clazz,name,sig); + } + jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticObjectField(this,clazz,fieldID); + } + jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticBooleanField(this,clazz,fieldID); + } + jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticByteField(this,clazz,fieldID); + } + jchar GetStaticCharField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticCharField(this,clazz,fieldID); + } + jshort GetStaticShortField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticShortField(this,clazz,fieldID); + } + jint GetStaticIntField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticIntField(this,clazz,fieldID); + } + jlong GetStaticLongField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticLongField(this,clazz,fieldID); + } + jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticFloatField(this,clazz,fieldID); + } + jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticDoubleField(this,clazz,fieldID); + } + + void SetStaticObjectField(jclass clazz, jfieldID fieldID, + jobject value) { + functions->SetStaticObjectField(this,clazz,fieldID,value); + } + void SetStaticBooleanField(jclass clazz, jfieldID fieldID, + jboolean value) { + functions->SetStaticBooleanField(this,clazz,fieldID,value); + } + void SetStaticByteField(jclass clazz, jfieldID fieldID, + jbyte value) { + functions->SetStaticByteField(this,clazz,fieldID,value); + } + void SetStaticCharField(jclass clazz, jfieldID fieldID, + jchar value) { + functions->SetStaticCharField(this,clazz,fieldID,value); + } + void SetStaticShortField(jclass clazz, jfieldID fieldID, + jshort value) { + functions->SetStaticShortField(this,clazz,fieldID,value); + } + void SetStaticIntField(jclass clazz, jfieldID fieldID, + jint value) { + functions->SetStaticIntField(this,clazz,fieldID,value); + } + void SetStaticLongField(jclass clazz, jfieldID fieldID, + jlong value) { + functions->SetStaticLongField(this,clazz,fieldID,value); + } + void SetStaticFloatField(jclass clazz, jfieldID fieldID, + jfloat value) { + functions->SetStaticFloatField(this,clazz,fieldID,value); + } + void SetStaticDoubleField(jclass clazz, jfieldID fieldID, + jdouble value) { + functions->SetStaticDoubleField(this,clazz,fieldID,value); + } + + jstring NewString(const jchar *unicode, jsize len) { + return functions->NewString(this,unicode,len); + } + jsize GetStringLength(jstring str) { + return functions->GetStringLength(this,str); + } + const jchar *GetStringChars(jstring str, jboolean *isCopy) { + return functions->GetStringChars(this,str,isCopy); + } + void ReleaseStringChars(jstring str, const jchar *chars) { + functions->ReleaseStringChars(this,str,chars); + } + + jstring NewStringUTF(const char *utf) { + return functions->NewStringUTF(this,utf); + } + jsize GetStringUTFLength(jstring str) { + return functions->GetStringUTFLength(this,str); + } + const char* GetStringUTFChars(jstring str, jboolean *isCopy) { + return functions->GetStringUTFChars(this,str,isCopy); + } + void ReleaseStringUTFChars(jstring str, const char* chars) { + functions->ReleaseStringUTFChars(this,str,chars); + } + + jsize GetArrayLength(jarray array) { + return functions->GetArrayLength(this,array); + } + + jobjectArray NewObjectArray(jsize len, jclass clazz, + jobject init) { + return functions->NewObjectArray(this,len,clazz,init); + } + jobject GetObjectArrayElement(jobjectArray array, jsize index) { + return functions->GetObjectArrayElement(this,array,index); + } + void SetObjectArrayElement(jobjectArray array, jsize index, + jobject val) { + functions->SetObjectArrayElement(this,array,index,val); + } + + jbooleanArray NewBooleanArray(jsize len) { + return functions->NewBooleanArray(this,len); + } + jbyteArray NewByteArray(jsize len) { + return functions->NewByteArray(this,len); + } + jcharArray NewCharArray(jsize len) { + return functions->NewCharArray(this,len); + } + jshortArray NewShortArray(jsize len) { + return functions->NewShortArray(this,len); + } + jintArray NewIntArray(jsize len) { + return functions->NewIntArray(this,len); + } + jlongArray NewLongArray(jsize len) { + return functions->NewLongArray(this,len); + } + jfloatArray NewFloatArray(jsize len) { + return functions->NewFloatArray(this,len); + } + jdoubleArray NewDoubleArray(jsize len) { + return functions->NewDoubleArray(this,len); + } + + jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) { + return functions->GetBooleanArrayElements(this,array,isCopy); + } + jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) { + return functions->GetByteArrayElements(this,array,isCopy); + } + jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) { + return functions->GetCharArrayElements(this,array,isCopy); + } + jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) { + return functions->GetShortArrayElements(this,array,isCopy); + } + jint * GetIntArrayElements(jintArray array, jboolean *isCopy) { + return functions->GetIntArrayElements(this,array,isCopy); + } + jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) { + return functions->GetLongArrayElements(this,array,isCopy); + } + jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) { + return functions->GetFloatArrayElements(this,array,isCopy); + } + jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) { + return functions->GetDoubleArrayElements(this,array,isCopy); + } + + void ReleaseBooleanArrayElements(jbooleanArray array, + jboolean *elems, + jint mode) { + functions->ReleaseBooleanArrayElements(this,array,elems,mode); + } + void ReleaseByteArrayElements(jbyteArray array, + jbyte *elems, + jint mode) { + functions->ReleaseByteArrayElements(this,array,elems,mode); + } + void ReleaseCharArrayElements(jcharArray array, + jchar *elems, + jint mode) { + functions->ReleaseCharArrayElements(this,array,elems,mode); + } + void ReleaseShortArrayElements(jshortArray array, + jshort *elems, + jint mode) { + functions->ReleaseShortArrayElements(this,array,elems,mode); + } + void ReleaseIntArrayElements(jintArray array, + jint *elems, + jint mode) { + functions->ReleaseIntArrayElements(this,array,elems,mode); + } + void ReleaseLongArrayElements(jlongArray array, + jlong *elems, + jint mode) { + functions->ReleaseLongArrayElements(this,array,elems,mode); + } + void ReleaseFloatArrayElements(jfloatArray array, + jfloat *elems, + jint mode) { + functions->ReleaseFloatArrayElements(this,array,elems,mode); + } + void ReleaseDoubleArrayElements(jdoubleArray array, + jdouble *elems, + jint mode) { + functions->ReleaseDoubleArrayElements(this,array,elems,mode); + } + + void GetBooleanArrayRegion(jbooleanArray array, + jsize start, jsize len, jboolean *buf) { + functions->GetBooleanArrayRegion(this,array,start,len,buf); + } + void GetByteArrayRegion(jbyteArray array, + jsize start, jsize len, jbyte *buf) { + functions->GetByteArrayRegion(this,array,start,len,buf); + } + void GetCharArrayRegion(jcharArray array, + jsize start, jsize len, jchar *buf) { + functions->GetCharArrayRegion(this,array,start,len,buf); + } + void GetShortArrayRegion(jshortArray array, + jsize start, jsize len, jshort *buf) { + functions->GetShortArrayRegion(this,array,start,len,buf); + } + void GetIntArrayRegion(jintArray array, + jsize start, jsize len, jint *buf) { + functions->GetIntArrayRegion(this,array,start,len,buf); + } + void GetLongArrayRegion(jlongArray array, + jsize start, jsize len, jlong *buf) { + functions->GetLongArrayRegion(this,array,start,len,buf); + } + void GetFloatArrayRegion(jfloatArray array, + jsize start, jsize len, jfloat *buf) { + functions->GetFloatArrayRegion(this,array,start,len,buf); + } + void GetDoubleArrayRegion(jdoubleArray array, + jsize start, jsize len, jdouble *buf) { + functions->GetDoubleArrayRegion(this,array,start,len,buf); + } + + void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, + const jboolean *buf) { + functions->SetBooleanArrayRegion(this,array,start,len,buf); + } + void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, + const jbyte *buf) { + functions->SetByteArrayRegion(this,array,start,len,buf); + } + void SetCharArrayRegion(jcharArray array, jsize start, jsize len, + const jchar *buf) { + functions->SetCharArrayRegion(this,array,start,len,buf); + } + void SetShortArrayRegion(jshortArray array, jsize start, jsize len, + const jshort *buf) { + functions->SetShortArrayRegion(this,array,start,len,buf); + } + void SetIntArrayRegion(jintArray array, jsize start, jsize len, + const jint *buf) { + functions->SetIntArrayRegion(this,array,start,len,buf); + } + void SetLongArrayRegion(jlongArray array, jsize start, jsize len, + const jlong *buf) { + functions->SetLongArrayRegion(this,array,start,len,buf); + } + void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, + const jfloat *buf) { + functions->SetFloatArrayRegion(this,array,start,len,buf); + } + void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, + const jdouble *buf) { + functions->SetDoubleArrayRegion(this,array,start,len,buf); + } + + jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, + jint nMethods) { + return functions->RegisterNatives(this,clazz,methods,nMethods); + } + jint UnregisterNatives(jclass clazz) { + return functions->UnregisterNatives(this,clazz); + } + + jint MonitorEnter(jobject obj) { + return functions->MonitorEnter(this,obj); + } + jint MonitorExit(jobject obj) { + return functions->MonitorExit(this,obj); + } + + jint GetJavaVM(JavaVM **vm) { + return functions->GetJavaVM(this,vm); + } + + void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { + functions->GetStringRegion(this,str,start,len,buf); + } + void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { + functions->GetStringUTFRegion(this,str,start,len,buf); + } + + void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) { + return functions->GetPrimitiveArrayCritical(this,array,isCopy); + } + void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) { + functions->ReleasePrimitiveArrayCritical(this,array,carray,mode); + } + + const jchar * GetStringCritical(jstring string, jboolean *isCopy) { + return functions->GetStringCritical(this,string,isCopy); + } + void ReleaseStringCritical(jstring string, const jchar *cstring) { + functions->ReleaseStringCritical(this,string,cstring); + } + + jweak NewWeakGlobalRef(jobject obj) { + return functions->NewWeakGlobalRef(this,obj); + } + void DeleteWeakGlobalRef(jweak ref) { + functions->DeleteWeakGlobalRef(this,ref); + } + + jboolean ExceptionCheck() { + return functions->ExceptionCheck(this); + } + + jobject NewDirectByteBuffer(void* address, jlong capacity) { + return functions->NewDirectByteBuffer(this, address, capacity); + } + void* GetDirectBufferAddress(jobject buf) { + return functions->GetDirectBufferAddress(this, buf); + } + jlong GetDirectBufferCapacity(jobject buf) { + return functions->GetDirectBufferCapacity(this, buf); + } + jobjectRefType GetObjectRefType(jobject obj) { + return functions->GetObjectRefType(this, obj); + } + +#endif /* __cplusplus */ +}; + +typedef struct JavaVMOption { + char *optionString; + void *extraInfo; +} JavaVMOption; + +typedef struct JavaVMInitArgs { + jint version; + + jint nOptions; + JavaVMOption *options; + jboolean ignoreUnrecognized; +} JavaVMInitArgs; + +typedef struct JavaVMAttachArgs { + jint version; + + char *name; + jobject group; +} JavaVMAttachArgs; + +/* These will be VM-specific. */ + +#define JDK1_2 +#define JDK1_4 + +/* End VM-specific. */ + +struct JNIInvokeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + +#if !TARGET_RT_MAC_CFM && defined(__ppc__) + void* cfm_vectors[4]; +#endif /* !TARGET_RT_MAC_CFM && defined(__ppc__) */ + + jint (JNICALL *DestroyJavaVM)(JavaVM *vm); + + jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args); + + jint (JNICALL *DetachCurrentThread)(JavaVM *vm); + + jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version); + + jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args); + +#if TARGET_RT_MAC_CFM && defined(__ppc__) + void* real_functions[5]; +#endif /* TARGET_RT_MAC_CFM && defined(__ppc__) */ +}; + +struct JavaVM_ { + const struct JNIInvokeInterface_ *functions; +#ifdef __cplusplus + + jint DestroyJavaVM() { + return functions->DestroyJavaVM(this); + } + jint AttachCurrentThread(void **penv, void *args) { + return functions->AttachCurrentThread(this, penv, args); + } + jint DetachCurrentThread() { + return functions->DetachCurrentThread(this); + } + + jint GetEnv(void **penv, jint version) { + return functions->GetEnv(this, penv, version); + } + jint AttachCurrentThreadAsDaemon(void **penv, void *args) { + return functions->AttachCurrentThreadAsDaemon(this, penv, args); + } +#endif +}; + +#ifdef _JNI_IMPLEMENTATION_ +#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT +#else +#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT +#endif +_JNI_IMPORT_OR_EXPORT_ __attribute__((deprecated)) jint JNICALL +JNI_GetDefaultJavaVMInitArgs(void *args); + +_JNI_IMPORT_OR_EXPORT_ __attribute__((deprecated)) jint JNICALL +JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args); + +_JNI_IMPORT_OR_EXPORT_ __attribute__((deprecated)) jint JNICALL +JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); + +/* Defined by native libraries. */ +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM *vm, void *reserved); + +JNIEXPORT void JNICALL +JNI_OnUnload(JavaVM *vm, void *reserved); + +#define JNI_VERSION_1_1 0x00010001 +#define JNI_VERSION_1_2 0x00010002 +#define JNI_VERSION_1_4 0x00010004 +#define JNI_VERSION_1_6 0x00010006 + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !_JAVASOFT_JNI_H_ */ + + + diff --git a/jansi/src/main/lib/inc_mac/jni_md.h b/jansi/src/main/lib/inc_mac/jni_md.h new file mode 100644 index 00000000..21cc90b3 --- /dev/null +++ b/jansi/src/main/lib/inc_mac/jni_md.h @@ -0,0 +1,23 @@ +/* + * @(#)jni_md.h 1.19 05/11/17 + * + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +#ifndef _JAVASOFT_JNI_MD_H_ +#define _JAVASOFT_JNI_MD_H_ + +#define JNIEXPORT __attribute__((visibility("default"))) +#define JNIIMPORT +#define JNICALL + +#if defined(__LP64__) && __LP64__ /* for -Wundef */ +typedef int jint; +#else +typedef long jint; +#endif +typedef long long jlong; +typedef signed char jbyte; + +#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/jansi/src/main/lib/inc_win/jni.h b/jansi/src/main/lib/inc_win/jni.h new file mode 100644 index 00000000..2b11e783 --- /dev/null +++ b/jansi/src/main/lib/inc_win/jni.h @@ -0,0 +1,1951 @@ +/* + * @(#)jni.h 1.56 03/12/19 + * + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +/* + * We used part of Netscape's Java Runtime Interface (JRI) as the starting + * point of our design and implementation. + */ + +/****************************************************************************** + * Java Runtime Interface + * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved. + *****************************************************************************/ + +#ifndef _JAVASOFT_JNI_H_ +#define _JAVASOFT_JNI_H_ + +#include +#include + +/* jni_md.h contains the machine-dependent typedefs for jbyte, jint + and jlong */ + +#include "jni_md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * JNI Types + */ + +#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H + +typedef unsigned char jboolean; +typedef unsigned short jchar; +typedef short jshort; +typedef float jfloat; +typedef double jdouble; + +typedef jint jsize; + +#ifdef __cplusplus + +class _jobject {}; +class _jclass : public _jobject {}; +class _jthrowable : public _jobject {}; +class _jstring : public _jobject {}; +class _jarray : public _jobject {}; +class _jbooleanArray : public _jarray {}; +class _jbyteArray : public _jarray {}; +class _jcharArray : public _jarray {}; +class _jshortArray : public _jarray {}; +class _jintArray : public _jarray {}; +class _jlongArray : public _jarray {}; +class _jfloatArray : public _jarray {}; +class _jdoubleArray : public _jarray {}; +class _jobjectArray : public _jarray {}; + +typedef _jobject *jobject; +typedef _jclass *jclass; +typedef _jthrowable *jthrowable; +typedef _jstring *jstring; +typedef _jarray *jarray; +typedef _jbooleanArray *jbooleanArray; +typedef _jbyteArray *jbyteArray; +typedef _jcharArray *jcharArray; +typedef _jshortArray *jshortArray; +typedef _jintArray *jintArray; +typedef _jlongArray *jlongArray; +typedef _jfloatArray *jfloatArray; +typedef _jdoubleArray *jdoubleArray; +typedef _jobjectArray *jobjectArray; + +#else + +struct _jobject; + +typedef struct _jobject *jobject; +typedef jobject jclass; +typedef jobject jthrowable; +typedef jobject jstring; +typedef jobject jarray; +typedef jarray jbooleanArray; +typedef jarray jbyteArray; +typedef jarray jcharArray; +typedef jarray jshortArray; +typedef jarray jintArray; +typedef jarray jlongArray; +typedef jarray jfloatArray; +typedef jarray jdoubleArray; +typedef jarray jobjectArray; + +#endif + +typedef jobject jweak; + +typedef union jvalue { + jboolean z; + jbyte b; + jchar c; + jshort s; + jint i; + jlong j; + jfloat f; + jdouble d; + jobject l; +} jvalue; + +struct _jfieldID; +typedef struct _jfieldID *jfieldID; + +struct _jmethodID; +typedef struct _jmethodID *jmethodID; + +#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */ + +/* + * jboolean constants + */ + +#define JNI_FALSE 0 +#define JNI_TRUE 1 + +/* + * possible return values for JNI functions. + */ + +#define JNI_OK 0 /* success */ +#define JNI_ERR (-1) /* unknown error */ +#define JNI_EDETACHED (-2) /* thread detached from the VM */ +#define JNI_EVERSION (-3) /* JNI version error */ +#define JNI_ENOMEM (-4) /* not enough memory */ +#define JNI_EEXIST (-5) /* VM already created */ +#define JNI_EINVAL (-6) /* invalid arguments */ + +/* + * used in ReleaseScalarArrayElements + */ + +#define JNI_COMMIT 1 +#define JNI_ABORT 2 + +/* + * used in RegisterNatives to describe native method name, signature, + * and function pointer. + */ + +typedef struct { + char *name; + char *signature; + void *fnPtr; +} JNINativeMethod; + +/* + * JNI Native Method Interface. + */ + +struct JNINativeInterface_; + +struct JNIEnv_; + +#ifdef __cplusplus +typedef JNIEnv_ JNIEnv; +#else +typedef const struct JNINativeInterface_ *JNIEnv; +#endif + +/* + * JNI Invocation Interface. + */ + +struct JNIInvokeInterface_; + +struct JavaVM_; + +#ifdef __cplusplus +typedef JavaVM_ JavaVM; +#else +typedef const struct JNIInvokeInterface_ *JavaVM; +#endif + +struct JNINativeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + + void *reserved3; + jint (JNICALL *GetVersion)(JNIEnv *env); + + jclass (JNICALL *DefineClass) + (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, + jsize len); + jclass (JNICALL *FindClass) + (JNIEnv *env, const char *name); + + jmethodID (JNICALL *FromReflectedMethod) + (JNIEnv *env, jobject method); + jfieldID (JNICALL *FromReflectedField) + (JNIEnv *env, jobject field); + + jobject (JNICALL *ToReflectedMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic); + + jclass (JNICALL *GetSuperclass) + (JNIEnv *env, jclass sub); + jboolean (JNICALL *IsAssignableFrom) + (JNIEnv *env, jclass sub, jclass sup); + + jobject (JNICALL *ToReflectedField) + (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic); + + jint (JNICALL *Throw) + (JNIEnv *env, jthrowable obj); + jint (JNICALL *ThrowNew) + (JNIEnv *env, jclass clazz, const char *msg); + jthrowable (JNICALL *ExceptionOccurred) + (JNIEnv *env); + void (JNICALL *ExceptionDescribe) + (JNIEnv *env); + void (JNICALL *ExceptionClear) + (JNIEnv *env); + void (JNICALL *FatalError) + (JNIEnv *env, const char *msg); + + jint (JNICALL *PushLocalFrame) + (JNIEnv *env, jint capacity); + jobject (JNICALL *PopLocalFrame) + (JNIEnv *env, jobject result); + + jobject (JNICALL *NewGlobalRef) + (JNIEnv *env, jobject lobj); + void (JNICALL *DeleteGlobalRef) + (JNIEnv *env, jobject gref); + void (JNICALL *DeleteLocalRef) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsSameObject) + (JNIEnv *env, jobject obj1, jobject obj2); + jobject (JNICALL *NewLocalRef) + (JNIEnv *env, jobject ref); + jint (JNICALL *EnsureLocalCapacity) + (JNIEnv *env, jint capacity); + + jobject (JNICALL *AllocObject) + (JNIEnv *env, jclass clazz); + jobject (JNICALL *NewObject) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *NewObjectV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *NewObjectA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jclass (JNICALL *GetObjectClass) + (JNIEnv *env, jobject obj); + jboolean (JNICALL *IsInstanceOf) + (JNIEnv *env, jobject obj, jclass clazz); + + jmethodID (JNICALL *GetMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallObjectMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jobject (JNICALL *CallObjectMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jobject (JNICALL *CallObjectMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jboolean (JNICALL *CallBooleanMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jboolean (JNICALL *CallBooleanMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jboolean (JNICALL *CallBooleanMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jbyte (JNICALL *CallByteMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jbyte (JNICALL *CallByteMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jbyte (JNICALL *CallByteMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallCharMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jchar (JNICALL *CallCharMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jchar (JNICALL *CallCharMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallShortMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jshort (JNICALL *CallShortMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jshort (JNICALL *CallShortMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallIntMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jint (JNICALL *CallIntMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jint (JNICALL *CallIntMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallLongMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jlong (JNICALL *CallLongMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jlong (JNICALL *CallLongMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallFloatMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jfloat (JNICALL *CallFloatMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jfloat (JNICALL *CallFloatMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallDoubleMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + jdouble (JNICALL *CallDoubleMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + jdouble (JNICALL *CallDoubleMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallVoidMethod) + (JNIEnv *env, jobject obj, jmethodID methodID, ...); + void (JNICALL *CallVoidMethodV) + (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); + void (JNICALL *CallVoidMethodA) + (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); + + jobject (JNICALL *CallNonvirtualObjectMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallNonvirtualObjectMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jobject (JNICALL *CallNonvirtualObjectMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jboolean (JNICALL *CallNonvirtualBooleanMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallNonvirtualBooleanMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jboolean (JNICALL *CallNonvirtualBooleanMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jbyte (JNICALL *CallNonvirtualByteMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallNonvirtualByteMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jbyte (JNICALL *CallNonvirtualByteMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jchar (JNICALL *CallNonvirtualCharMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallNonvirtualCharMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jchar (JNICALL *CallNonvirtualCharMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jshort (JNICALL *CallNonvirtualShortMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallNonvirtualShortMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jshort (JNICALL *CallNonvirtualShortMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jint (JNICALL *CallNonvirtualIntMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallNonvirtualIntMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jint (JNICALL *CallNonvirtualIntMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jlong (JNICALL *CallNonvirtualLongMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallNonvirtualLongMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jlong (JNICALL *CallNonvirtualLongMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jfloat (JNICALL *CallNonvirtualFloatMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallNonvirtualFloatMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jfloat (JNICALL *CallNonvirtualFloatMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + jdouble (JNICALL *CallNonvirtualDoubleMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallNonvirtualDoubleMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + jdouble (JNICALL *CallNonvirtualDoubleMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue *args); + + void (JNICALL *CallNonvirtualVoidMethod) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); + void (JNICALL *CallNonvirtualVoidMethodV) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + va_list args); + void (JNICALL *CallNonvirtualVoidMethodA) + (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, + const jvalue * args); + + jfieldID (JNICALL *GetFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *GetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jboolean (JNICALL *GetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jbyte (JNICALL *GetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jchar (JNICALL *GetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jshort (JNICALL *GetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jint (JNICALL *GetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jlong (JNICALL *GetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jfloat (JNICALL *GetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + jdouble (JNICALL *GetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID); + + void (JNICALL *SetObjectField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val); + void (JNICALL *SetBooleanField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val); + void (JNICALL *SetByteField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val); + void (JNICALL *SetCharField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val); + void (JNICALL *SetShortField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val); + void (JNICALL *SetIntField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jint val); + void (JNICALL *SetLongField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val); + void (JNICALL *SetFloatField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val); + void (JNICALL *SetDoubleField) + (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val); + + jmethodID (JNICALL *GetStaticMethodID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + + jobject (JNICALL *CallStaticObjectMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jobject (JNICALL *CallStaticObjectMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jobject (JNICALL *CallStaticObjectMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jboolean (JNICALL *CallStaticBooleanMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jboolean (JNICALL *CallStaticBooleanMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jboolean (JNICALL *CallStaticBooleanMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jbyte (JNICALL *CallStaticByteMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jbyte (JNICALL *CallStaticByteMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jbyte (JNICALL *CallStaticByteMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jchar (JNICALL *CallStaticCharMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jchar (JNICALL *CallStaticCharMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jchar (JNICALL *CallStaticCharMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jshort (JNICALL *CallStaticShortMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jshort (JNICALL *CallStaticShortMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jshort (JNICALL *CallStaticShortMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jint (JNICALL *CallStaticIntMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jint (JNICALL *CallStaticIntMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jint (JNICALL *CallStaticIntMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jlong (JNICALL *CallStaticLongMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jlong (JNICALL *CallStaticLongMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jlong (JNICALL *CallStaticLongMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jfloat (JNICALL *CallStaticFloatMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jfloat (JNICALL *CallStaticFloatMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jfloat (JNICALL *CallStaticFloatMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + jdouble (JNICALL *CallStaticDoubleMethod) + (JNIEnv *env, jclass clazz, jmethodID methodID, ...); + jdouble (JNICALL *CallStaticDoubleMethodV) + (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); + jdouble (JNICALL *CallStaticDoubleMethodA) + (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); + + void (JNICALL *CallStaticVoidMethod) + (JNIEnv *env, jclass cls, jmethodID methodID, ...); + void (JNICALL *CallStaticVoidMethodV) + (JNIEnv *env, jclass cls, jmethodID methodID, va_list args); + void (JNICALL *CallStaticVoidMethodA) + (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args); + + jfieldID (JNICALL *GetStaticFieldID) + (JNIEnv *env, jclass clazz, const char *name, const char *sig); + jobject (JNICALL *GetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jboolean (JNICALL *GetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jbyte (JNICALL *GetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jchar (JNICALL *GetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jshort (JNICALL *GetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jint (JNICALL *GetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jlong (JNICALL *GetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jfloat (JNICALL *GetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + jdouble (JNICALL *GetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID); + + void (JNICALL *SetStaticObjectField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value); + void (JNICALL *SetStaticBooleanField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value); + void (JNICALL *SetStaticByteField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value); + void (JNICALL *SetStaticCharField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value); + void (JNICALL *SetStaticShortField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value); + void (JNICALL *SetStaticIntField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value); + void (JNICALL *SetStaticLongField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value); + void (JNICALL *SetStaticFloatField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value); + void (JNICALL *SetStaticDoubleField) + (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value); + + jstring (JNICALL *NewString) + (JNIEnv *env, const jchar *unicode, jsize len); + jsize (JNICALL *GetStringLength) + (JNIEnv *env, jstring str); + const jchar *(JNICALL *GetStringChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringChars) + (JNIEnv *env, jstring str, const jchar *chars); + + jstring (JNICALL *NewStringUTF) + (JNIEnv *env, const char *utf); + jsize (JNICALL *GetStringUTFLength) + (JNIEnv *env, jstring str); + const char* (JNICALL *GetStringUTFChars) + (JNIEnv *env, jstring str, jboolean *isCopy); + void (JNICALL *ReleaseStringUTFChars) + (JNIEnv *env, jstring str, const char* chars); + + + jsize (JNICALL *GetArrayLength) + (JNIEnv *env, jarray array); + + jobjectArray (JNICALL *NewObjectArray) + (JNIEnv *env, jsize len, jclass clazz, jobject init); + jobject (JNICALL *GetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index); + void (JNICALL *SetObjectArrayElement) + (JNIEnv *env, jobjectArray array, jsize index, jobject val); + + jbooleanArray (JNICALL *NewBooleanArray) + (JNIEnv *env, jsize len); + jbyteArray (JNICALL *NewByteArray) + (JNIEnv *env, jsize len); + jcharArray (JNICALL *NewCharArray) + (JNIEnv *env, jsize len); + jshortArray (JNICALL *NewShortArray) + (JNIEnv *env, jsize len); + jintArray (JNICALL *NewIntArray) + (JNIEnv *env, jsize len); + jlongArray (JNICALL *NewLongArray) + (JNIEnv *env, jsize len); + jfloatArray (JNICALL *NewFloatArray) + (JNIEnv *env, jsize len); + jdoubleArray (JNICALL *NewDoubleArray) + (JNIEnv *env, jsize len); + + jboolean * (JNICALL *GetBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *isCopy); + jbyte * (JNICALL *GetByteArrayElements) + (JNIEnv *env, jbyteArray array, jboolean *isCopy); + jchar * (JNICALL *GetCharArrayElements) + (JNIEnv *env, jcharArray array, jboolean *isCopy); + jshort * (JNICALL *GetShortArrayElements) + (JNIEnv *env, jshortArray array, jboolean *isCopy); + jint * (JNICALL *GetIntArrayElements) + (JNIEnv *env, jintArray array, jboolean *isCopy); + jlong * (JNICALL *GetLongArrayElements) + (JNIEnv *env, jlongArray array, jboolean *isCopy); + jfloat * (JNICALL *GetFloatArrayElements) + (JNIEnv *env, jfloatArray array, jboolean *isCopy); + jdouble * (JNICALL *GetDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jboolean *isCopy); + + void (JNICALL *ReleaseBooleanArrayElements) + (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode); + void (JNICALL *ReleaseByteArrayElements) + (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode); + void (JNICALL *ReleaseCharArrayElements) + (JNIEnv *env, jcharArray array, jchar *elems, jint mode); + void (JNICALL *ReleaseShortArrayElements) + (JNIEnv *env, jshortArray array, jshort *elems, jint mode); + void (JNICALL *ReleaseIntArrayElements) + (JNIEnv *env, jintArray array, jint *elems, jint mode); + void (JNICALL *ReleaseLongArrayElements) + (JNIEnv *env, jlongArray array, jlong *elems, jint mode); + void (JNICALL *ReleaseFloatArrayElements) + (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode); + void (JNICALL *ReleaseDoubleArrayElements) + (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode); + + void (JNICALL *GetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf); + void (JNICALL *GetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf); + void (JNICALL *GetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf); + void (JNICALL *GetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf); + void (JNICALL *GetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf); + void (JNICALL *GetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf); + void (JNICALL *GetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf); + void (JNICALL *GetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf); + + void (JNICALL *SetBooleanArrayRegion) + (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf); + void (JNICALL *SetByteArrayRegion) + (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf); + void (JNICALL *SetCharArrayRegion) + (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf); + void (JNICALL *SetShortArrayRegion) + (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf); + void (JNICALL *SetIntArrayRegion) + (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf); + void (JNICALL *SetLongArrayRegion) + (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf); + void (JNICALL *SetFloatArrayRegion) + (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf); + void (JNICALL *SetDoubleArrayRegion) + (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf); + + jint (JNICALL *RegisterNatives) + (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, + jint nMethods); + jint (JNICALL *UnregisterNatives) + (JNIEnv *env, jclass clazz); + + jint (JNICALL *MonitorEnter) + (JNIEnv *env, jobject obj); + jint (JNICALL *MonitorExit) + (JNIEnv *env, jobject obj); + + jint (JNICALL *GetJavaVM) + (JNIEnv *env, JavaVM **vm); + + void (JNICALL *GetStringRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf); + void (JNICALL *GetStringUTFRegion) + (JNIEnv *env, jstring str, jsize start, jsize len, char *buf); + + void * (JNICALL *GetPrimitiveArrayCritical) + (JNIEnv *env, jarray array, jboolean *isCopy); + void (JNICALL *ReleasePrimitiveArrayCritical) + (JNIEnv *env, jarray array, void *carray, jint mode); + + const jchar * (JNICALL *GetStringCritical) + (JNIEnv *env, jstring string, jboolean *isCopy); + void (JNICALL *ReleaseStringCritical) + (JNIEnv *env, jstring string, const jchar *cstring); + + jweak (JNICALL *NewWeakGlobalRef) + (JNIEnv *env, jobject obj); + void (JNICALL *DeleteWeakGlobalRef) + (JNIEnv *env, jweak ref); + + jboolean (JNICALL *ExceptionCheck) + (JNIEnv *env); + + jobject (JNICALL *NewDirectByteBuffer) + (JNIEnv* env, void* address, jlong capacity); + void* (JNICALL *GetDirectBufferAddress) + (JNIEnv* env, jobject buf); + jlong (JNICALL *GetDirectBufferCapacity) + (JNIEnv* env, jobject buf); +}; + +/* + * We use inlined functions for C++ so that programmers can write: + * + * env->FindClass("java/lang/String") + * + * in C++ rather than: + * + * (*env)->FindClass(env, "java/lang/String") + * + * in C. + */ + +struct JNIEnv_ { + const struct JNINativeInterface_ *functions; +#ifdef __cplusplus + + jint GetVersion() { + return functions->GetVersion(this); + } + jclass DefineClass(const char *name, jobject loader, const jbyte *buf, + jsize len) { + return functions->DefineClass(this, name, loader, buf, len); + } + jclass FindClass(const char *name) { + return functions->FindClass(this, name); + } + jmethodID FromReflectedMethod(jobject method) { + return functions->FromReflectedMethod(this,method); + } + jfieldID FromReflectedField(jobject field) { + return functions->FromReflectedField(this,field); + } + + jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) { + return functions->ToReflectedMethod(this, cls, methodID, isStatic); + } + + jclass GetSuperclass(jclass sub) { + return functions->GetSuperclass(this, sub); + } + jboolean IsAssignableFrom(jclass sub, jclass sup) { + return functions->IsAssignableFrom(this, sub, sup); + } + + jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) { + return functions->ToReflectedField(this,cls,fieldID,isStatic); + } + + jint Throw(jthrowable obj) { + return functions->Throw(this, obj); + } + jint ThrowNew(jclass clazz, const char *msg) { + return functions->ThrowNew(this, clazz, msg); + } + jthrowable ExceptionOccurred() { + return functions->ExceptionOccurred(this); + } + void ExceptionDescribe() { + functions->ExceptionDescribe(this); + } + void ExceptionClear() { + functions->ExceptionClear(this); + } + void FatalError(const char *msg) { + functions->FatalError(this, msg); + } + + jint PushLocalFrame(jint capacity) { + return functions->PushLocalFrame(this,capacity); + } + jobject PopLocalFrame(jobject result) { + return functions->PopLocalFrame(this,result); + } + + jobject NewGlobalRef(jobject lobj) { + return functions->NewGlobalRef(this,lobj); + } + void DeleteGlobalRef(jobject gref) { + functions->DeleteGlobalRef(this,gref); + } + void DeleteLocalRef(jobject obj) { + functions->DeleteLocalRef(this, obj); + } + + jboolean IsSameObject(jobject obj1, jobject obj2) { + return functions->IsSameObject(this,obj1,obj2); + } + + jobject NewLocalRef(jobject ref) { + return functions->NewLocalRef(this,ref); + } + jint EnsureLocalCapacity(jint capacity) { + return functions->EnsureLocalCapacity(this,capacity); + } + + jobject AllocObject(jclass clazz) { + return functions->AllocObject(this,clazz); + } + jobject NewObject(jclass clazz, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args, methodID); + result = functions->NewObjectV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject NewObjectV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->NewObjectV(this,clazz,methodID,args); + } + jobject NewObjectA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->NewObjectA(this,clazz,methodID,args); + } + + jclass GetObjectClass(jobject obj) { + return functions->GetObjectClass(this,obj); + } + jboolean IsInstanceOf(jobject obj, jclass clazz) { + return functions->IsInstanceOf(this,obj,clazz); + } + + jmethodID GetMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetMethodID(this,clazz,name,sig); + } + + jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallObjectMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jobject CallObjectMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallObjectMethodV(this,obj,methodID,args); + } + jobject CallObjectMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallObjectMethodA(this,obj,methodID,args); + } + + jboolean CallBooleanMethod(jobject obj, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallBooleanMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallBooleanMethodV(this,obj,methodID,args); + } + jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallBooleanMethodA(this,obj,methodID, args); + } + + jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallByteMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jbyte CallByteMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallByteMethodV(this,obj,methodID,args); + } + jbyte CallByteMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallByteMethodA(this,obj,methodID,args); + } + + jchar CallCharMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallCharMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jchar CallCharMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallCharMethodV(this,obj,methodID,args); + } + jchar CallCharMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallCharMethodA(this,obj,methodID,args); + } + + jshort CallShortMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallShortMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jshort CallShortMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallShortMethodV(this,obj,methodID,args); + } + jshort CallShortMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallShortMethodA(this,obj,methodID,args); + } + + jint CallIntMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallIntMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jint CallIntMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallIntMethodV(this,obj,methodID,args); + } + jint CallIntMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallIntMethodA(this,obj,methodID,args); + } + + jlong CallLongMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallLongMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jlong CallLongMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallLongMethodV(this,obj,methodID,args); + } + jlong CallLongMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallLongMethodA(this,obj,methodID,args); + } + + jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallFloatMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jfloat CallFloatMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallFloatMethodV(this,obj,methodID,args); + } + jfloat CallFloatMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallFloatMethodA(this,obj,methodID,args); + } + + jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallDoubleMethodV(this,obj,methodID,args); + va_end(args); + return result; + } + jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, + va_list args) { + return functions->CallDoubleMethodV(this,obj,methodID,args); + } + jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + return functions->CallDoubleMethodA(this,obj,methodID,args); + } + + void CallVoidMethod(jobject obj, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallVoidMethodV(this,obj,methodID,args); + va_end(args); + } + void CallVoidMethodV(jobject obj, jmethodID methodID, + va_list args) { + functions->CallVoidMethodV(this,obj,methodID,args); + } + void CallVoidMethodA(jobject obj, jmethodID methodID, + const jvalue * args) { + functions->CallVoidMethodA(this,obj,methodID,args); + } + + jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualObjectMethodV(this,obj,clazz, + methodID,args); + } + jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualObjectMethodA(this,obj,clazz, + methodID,args); + } + + jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualBooleanMethodV(this,obj,clazz, + methodID,args); + } + jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualBooleanMethodA(this,obj,clazz, + methodID, args); + } + + jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualByteMethodV(this,obj,clazz, + methodID,args); + } + jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualByteMethodA(this,obj,clazz, + methodID,args); + } + + jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualCharMethodV(this,obj,clazz, + methodID,args); + } + jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualCharMethodA(this,obj,clazz, + methodID,args); + } + + jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualShortMethodV(this,obj,clazz, + methodID,args); + } + jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualShortMethodA(this,obj,clazz, + methodID,args); + } + + jint CallNonvirtualIntMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualIntMethodV(this,obj,clazz, + methodID,args); + } + jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualIntMethodA(this,obj,clazz, + methodID,args); + } + + jlong CallNonvirtualLongMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallNonvirtualLongMethodV(this,obj,clazz, + methodID,args); + } + jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, + jmethodID methodID, const jvalue * args) { + return functions->CallNonvirtualLongMethodA(this,obj,clazz, + methodID,args); + } + + jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualFloatMethodV(this,obj,clazz, + methodID,args); + } + jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualFloatMethodA(this,obj,clazz, + methodID,args); + } + + jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + va_end(args); + return result; + } + jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + return functions->CallNonvirtualDoubleMethodV(this,obj,clazz, + methodID,args); + } + jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + return functions->CallNonvirtualDoubleMethodA(this,obj,clazz, + methodID,args); + } + + void CallNonvirtualVoidMethod(jobject obj, jclass clazz, + jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + va_end(args); + } + void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, + jmethodID methodID, + va_list args) { + functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); + } + void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, + jmethodID methodID, + const jvalue * args) { + functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args); + } + + jfieldID GetFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetFieldID(this,clazz,name,sig); + } + + jobject GetObjectField(jobject obj, jfieldID fieldID) { + return functions->GetObjectField(this,obj,fieldID); + } + jboolean GetBooleanField(jobject obj, jfieldID fieldID) { + return functions->GetBooleanField(this,obj,fieldID); + } + jbyte GetByteField(jobject obj, jfieldID fieldID) { + return functions->GetByteField(this,obj,fieldID); + } + jchar GetCharField(jobject obj, jfieldID fieldID) { + return functions->GetCharField(this,obj,fieldID); + } + jshort GetShortField(jobject obj, jfieldID fieldID) { + return functions->GetShortField(this,obj,fieldID); + } + jint GetIntField(jobject obj, jfieldID fieldID) { + return functions->GetIntField(this,obj,fieldID); + } + jlong GetLongField(jobject obj, jfieldID fieldID) { + return functions->GetLongField(this,obj,fieldID); + } + jfloat GetFloatField(jobject obj, jfieldID fieldID) { + return functions->GetFloatField(this,obj,fieldID); + } + jdouble GetDoubleField(jobject obj, jfieldID fieldID) { + return functions->GetDoubleField(this,obj,fieldID); + } + + void SetObjectField(jobject obj, jfieldID fieldID, jobject val) { + functions->SetObjectField(this,obj,fieldID,val); + } + void SetBooleanField(jobject obj, jfieldID fieldID, + jboolean val) { + functions->SetBooleanField(this,obj,fieldID,val); + } + void SetByteField(jobject obj, jfieldID fieldID, + jbyte val) { + functions->SetByteField(this,obj,fieldID,val); + } + void SetCharField(jobject obj, jfieldID fieldID, + jchar val) { + functions->SetCharField(this,obj,fieldID,val); + } + void SetShortField(jobject obj, jfieldID fieldID, + jshort val) { + functions->SetShortField(this,obj,fieldID,val); + } + void SetIntField(jobject obj, jfieldID fieldID, + jint val) { + functions->SetIntField(this,obj,fieldID,val); + } + void SetLongField(jobject obj, jfieldID fieldID, + jlong val) { + functions->SetLongField(this,obj,fieldID,val); + } + void SetFloatField(jobject obj, jfieldID fieldID, + jfloat val) { + functions->SetFloatField(this,obj,fieldID,val); + } + void SetDoubleField(jobject obj, jfieldID fieldID, + jdouble val) { + functions->SetDoubleField(this,obj,fieldID,val); + } + + jmethodID GetStaticMethodID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticMethodID(this,clazz,name,sig); + } + + jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, + ...) { + va_list args; + jobject result; + va_start(args,methodID); + result = functions->CallStaticObjectMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, + va_list args) { + return functions->CallStaticObjectMethodV(this,clazz,methodID,args); + } + jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, + const jvalue *args) { + return functions->CallStaticObjectMethodA(this,clazz,methodID,args); + } + + jboolean CallStaticBooleanMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jboolean result; + va_start(args,methodID); + result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jboolean CallStaticBooleanMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticBooleanMethodV(this,clazz,methodID,args); + } + jboolean CallStaticBooleanMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticBooleanMethodA(this,clazz,methodID,args); + } + + jbyte CallStaticByteMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jbyte result; + va_start(args,methodID); + result = functions->CallStaticByteMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jbyte CallStaticByteMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticByteMethodV(this,clazz,methodID,args); + } + jbyte CallStaticByteMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticByteMethodA(this,clazz,methodID,args); + } + + jchar CallStaticCharMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jchar result; + va_start(args,methodID); + result = functions->CallStaticCharMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jchar CallStaticCharMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticCharMethodV(this,clazz,methodID,args); + } + jchar CallStaticCharMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticCharMethodA(this,clazz,methodID,args); + } + + jshort CallStaticShortMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jshort result; + va_start(args,methodID); + result = functions->CallStaticShortMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jshort CallStaticShortMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticShortMethodV(this,clazz,methodID,args); + } + jshort CallStaticShortMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticShortMethodA(this,clazz,methodID,args); + } + + jint CallStaticIntMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jint result; + va_start(args,methodID); + result = functions->CallStaticIntMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jint CallStaticIntMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticIntMethodV(this,clazz,methodID,args); + } + jint CallStaticIntMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticIntMethodA(this,clazz,methodID,args); + } + + jlong CallStaticLongMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jlong result; + va_start(args,methodID); + result = functions->CallStaticLongMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jlong CallStaticLongMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticLongMethodV(this,clazz,methodID,args); + } + jlong CallStaticLongMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticLongMethodA(this,clazz,methodID,args); + } + + jfloat CallStaticFloatMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jfloat result; + va_start(args,methodID); + result = functions->CallStaticFloatMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jfloat CallStaticFloatMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticFloatMethodV(this,clazz,methodID,args); + } + jfloat CallStaticFloatMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticFloatMethodA(this,clazz,methodID,args); + } + + jdouble CallStaticDoubleMethod(jclass clazz, + jmethodID methodID, ...) { + va_list args; + jdouble result; + va_start(args,methodID); + result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + va_end(args); + return result; + } + jdouble CallStaticDoubleMethodV(jclass clazz, + jmethodID methodID, va_list args) { + return functions->CallStaticDoubleMethodV(this,clazz,methodID,args); + } + jdouble CallStaticDoubleMethodA(jclass clazz, + jmethodID methodID, const jvalue *args) { + return functions->CallStaticDoubleMethodA(this,clazz,methodID,args); + } + + void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) { + va_list args; + va_start(args,methodID); + functions->CallStaticVoidMethodV(this,cls,methodID,args); + va_end(args); + } + void CallStaticVoidMethodV(jclass cls, jmethodID methodID, + va_list args) { + functions->CallStaticVoidMethodV(this,cls,methodID,args); + } + void CallStaticVoidMethodA(jclass cls, jmethodID methodID, + const jvalue * args) { + functions->CallStaticVoidMethodA(this,cls,methodID,args); + } + + jfieldID GetStaticFieldID(jclass clazz, const char *name, + const char *sig) { + return functions->GetStaticFieldID(this,clazz,name,sig); + } + jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticObjectField(this,clazz,fieldID); + } + jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticBooleanField(this,clazz,fieldID); + } + jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticByteField(this,clazz,fieldID); + } + jchar GetStaticCharField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticCharField(this,clazz,fieldID); + } + jshort GetStaticShortField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticShortField(this,clazz,fieldID); + } + jint GetStaticIntField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticIntField(this,clazz,fieldID); + } + jlong GetStaticLongField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticLongField(this,clazz,fieldID); + } + jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticFloatField(this,clazz,fieldID); + } + jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) { + return functions->GetStaticDoubleField(this,clazz,fieldID); + } + + void SetStaticObjectField(jclass clazz, jfieldID fieldID, + jobject value) { + functions->SetStaticObjectField(this,clazz,fieldID,value); + } + void SetStaticBooleanField(jclass clazz, jfieldID fieldID, + jboolean value) { + functions->SetStaticBooleanField(this,clazz,fieldID,value); + } + void SetStaticByteField(jclass clazz, jfieldID fieldID, + jbyte value) { + functions->SetStaticByteField(this,clazz,fieldID,value); + } + void SetStaticCharField(jclass clazz, jfieldID fieldID, + jchar value) { + functions->SetStaticCharField(this,clazz,fieldID,value); + } + void SetStaticShortField(jclass clazz, jfieldID fieldID, + jshort value) { + functions->SetStaticShortField(this,clazz,fieldID,value); + } + void SetStaticIntField(jclass clazz, jfieldID fieldID, + jint value) { + functions->SetStaticIntField(this,clazz,fieldID,value); + } + void SetStaticLongField(jclass clazz, jfieldID fieldID, + jlong value) { + functions->SetStaticLongField(this,clazz,fieldID,value); + } + void SetStaticFloatField(jclass clazz, jfieldID fieldID, + jfloat value) { + functions->SetStaticFloatField(this,clazz,fieldID,value); + } + void SetStaticDoubleField(jclass clazz, jfieldID fieldID, + jdouble value) { + functions->SetStaticDoubleField(this,clazz,fieldID,value); + } + + jstring NewString(const jchar *unicode, jsize len) { + return functions->NewString(this,unicode,len); + } + jsize GetStringLength(jstring str) { + return functions->GetStringLength(this,str); + } + const jchar *GetStringChars(jstring str, jboolean *isCopy) { + return functions->GetStringChars(this,str,isCopy); + } + void ReleaseStringChars(jstring str, const jchar *chars) { + functions->ReleaseStringChars(this,str,chars); + } + + jstring NewStringUTF(const char *utf) { + return functions->NewStringUTF(this,utf); + } + jsize GetStringUTFLength(jstring str) { + return functions->GetStringUTFLength(this,str); + } + const char* GetStringUTFChars(jstring str, jboolean *isCopy) { + return functions->GetStringUTFChars(this,str,isCopy); + } + void ReleaseStringUTFChars(jstring str, const char* chars) { + functions->ReleaseStringUTFChars(this,str,chars); + } + + jsize GetArrayLength(jarray array) { + return functions->GetArrayLength(this,array); + } + + jobjectArray NewObjectArray(jsize len, jclass clazz, + jobject init) { + return functions->NewObjectArray(this,len,clazz,init); + } + jobject GetObjectArrayElement(jobjectArray array, jsize index) { + return functions->GetObjectArrayElement(this,array,index); + } + void SetObjectArrayElement(jobjectArray array, jsize index, + jobject val) { + functions->SetObjectArrayElement(this,array,index,val); + } + + jbooleanArray NewBooleanArray(jsize len) { + return functions->NewBooleanArray(this,len); + } + jbyteArray NewByteArray(jsize len) { + return functions->NewByteArray(this,len); + } + jcharArray NewCharArray(jsize len) { + return functions->NewCharArray(this,len); + } + jshortArray NewShortArray(jsize len) { + return functions->NewShortArray(this,len); + } + jintArray NewIntArray(jsize len) { + return functions->NewIntArray(this,len); + } + jlongArray NewLongArray(jsize len) { + return functions->NewLongArray(this,len); + } + jfloatArray NewFloatArray(jsize len) { + return functions->NewFloatArray(this,len); + } + jdoubleArray NewDoubleArray(jsize len) { + return functions->NewDoubleArray(this,len); + } + + jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) { + return functions->GetBooleanArrayElements(this,array,isCopy); + } + jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) { + return functions->GetByteArrayElements(this,array,isCopy); + } + jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) { + return functions->GetCharArrayElements(this,array,isCopy); + } + jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) { + return functions->GetShortArrayElements(this,array,isCopy); + } + jint * GetIntArrayElements(jintArray array, jboolean *isCopy) { + return functions->GetIntArrayElements(this,array,isCopy); + } + jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) { + return functions->GetLongArrayElements(this,array,isCopy); + } + jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) { + return functions->GetFloatArrayElements(this,array,isCopy); + } + jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) { + return functions->GetDoubleArrayElements(this,array,isCopy); + } + + void ReleaseBooleanArrayElements(jbooleanArray array, + jboolean *elems, + jint mode) { + functions->ReleaseBooleanArrayElements(this,array,elems,mode); + } + void ReleaseByteArrayElements(jbyteArray array, + jbyte *elems, + jint mode) { + functions->ReleaseByteArrayElements(this,array,elems,mode); + } + void ReleaseCharArrayElements(jcharArray array, + jchar *elems, + jint mode) { + functions->ReleaseCharArrayElements(this,array,elems,mode); + } + void ReleaseShortArrayElements(jshortArray array, + jshort *elems, + jint mode) { + functions->ReleaseShortArrayElements(this,array,elems,mode); + } + void ReleaseIntArrayElements(jintArray array, + jint *elems, + jint mode) { + functions->ReleaseIntArrayElements(this,array,elems,mode); + } + void ReleaseLongArrayElements(jlongArray array, + jlong *elems, + jint mode) { + functions->ReleaseLongArrayElements(this,array,elems,mode); + } + void ReleaseFloatArrayElements(jfloatArray array, + jfloat *elems, + jint mode) { + functions->ReleaseFloatArrayElements(this,array,elems,mode); + } + void ReleaseDoubleArrayElements(jdoubleArray array, + jdouble *elems, + jint mode) { + functions->ReleaseDoubleArrayElements(this,array,elems,mode); + } + + void GetBooleanArrayRegion(jbooleanArray array, + jsize start, jsize len, jboolean *buf) { + functions->GetBooleanArrayRegion(this,array,start,len,buf); + } + void GetByteArrayRegion(jbyteArray array, + jsize start, jsize len, jbyte *buf) { + functions->GetByteArrayRegion(this,array,start,len,buf); + } + void GetCharArrayRegion(jcharArray array, + jsize start, jsize len, jchar *buf) { + functions->GetCharArrayRegion(this,array,start,len,buf); + } + void GetShortArrayRegion(jshortArray array, + jsize start, jsize len, jshort *buf) { + functions->GetShortArrayRegion(this,array,start,len,buf); + } + void GetIntArrayRegion(jintArray array, + jsize start, jsize len, jint *buf) { + functions->GetIntArrayRegion(this,array,start,len,buf); + } + void GetLongArrayRegion(jlongArray array, + jsize start, jsize len, jlong *buf) { + functions->GetLongArrayRegion(this,array,start,len,buf); + } + void GetFloatArrayRegion(jfloatArray array, + jsize start, jsize len, jfloat *buf) { + functions->GetFloatArrayRegion(this,array,start,len,buf); + } + void GetDoubleArrayRegion(jdoubleArray array, + jsize start, jsize len, jdouble *buf) { + functions->GetDoubleArrayRegion(this,array,start,len,buf); + } + + void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, + const jboolean *buf) { + functions->SetBooleanArrayRegion(this,array,start,len,buf); + } + void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, + const jbyte *buf) { + functions->SetByteArrayRegion(this,array,start,len,buf); + } + void SetCharArrayRegion(jcharArray array, jsize start, jsize len, + const jchar *buf) { + functions->SetCharArrayRegion(this,array,start,len,buf); + } + void SetShortArrayRegion(jshortArray array, jsize start, jsize len, + const jshort *buf) { + functions->SetShortArrayRegion(this,array,start,len,buf); + } + void SetIntArrayRegion(jintArray array, jsize start, jsize len, + const jint *buf) { + functions->SetIntArrayRegion(this,array,start,len,buf); + } + void SetLongArrayRegion(jlongArray array, jsize start, jsize len, + const jlong *buf) { + functions->SetLongArrayRegion(this,array,start,len,buf); + } + void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, + const jfloat *buf) { + functions->SetFloatArrayRegion(this,array,start,len,buf); + } + void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, + const jdouble *buf) { + functions->SetDoubleArrayRegion(this,array,start,len,buf); + } + + jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, + jint nMethods) { + return functions->RegisterNatives(this,clazz,methods,nMethods); + } + jint UnregisterNatives(jclass clazz) { + return functions->UnregisterNatives(this,clazz); + } + + jint MonitorEnter(jobject obj) { + return functions->MonitorEnter(this,obj); + } + jint MonitorExit(jobject obj) { + return functions->MonitorExit(this,obj); + } + + jint GetJavaVM(JavaVM **vm) { + return functions->GetJavaVM(this,vm); + } + + void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { + functions->GetStringRegion(this,str,start,len,buf); + } + void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { + functions->GetStringUTFRegion(this,str,start,len,buf); + } + + void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) { + return functions->GetPrimitiveArrayCritical(this,array,isCopy); + } + void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) { + functions->ReleasePrimitiveArrayCritical(this,array,carray,mode); + } + + const jchar * GetStringCritical(jstring string, jboolean *isCopy) { + return functions->GetStringCritical(this,string,isCopy); + } + void ReleaseStringCritical(jstring string, const jchar *cstring) { + functions->ReleaseStringCritical(this,string,cstring); + } + + jweak NewWeakGlobalRef(jobject obj) { + return functions->NewWeakGlobalRef(this,obj); + } + void DeleteWeakGlobalRef(jweak ref) { + functions->DeleteWeakGlobalRef(this,ref); + } + + jboolean ExceptionCheck() { + return functions->ExceptionCheck(this); + } + + jobject NewDirectByteBuffer(void* address, jlong capacity) { + return functions->NewDirectByteBuffer(this, address, capacity); + } + void* GetDirectBufferAddress(jobject buf) { + return functions->GetDirectBufferAddress(this, buf); + } + jlong GetDirectBufferCapacity(jobject buf) { + return functions->GetDirectBufferCapacity(this, buf); + } + +#endif /* __cplusplus */ +}; + +typedef struct JavaVMOption { + char *optionString; + void *extraInfo; +} JavaVMOption; + +typedef struct JavaVMInitArgs { + jint version; + + jint nOptions; + JavaVMOption *options; + jboolean ignoreUnrecognized; +} JavaVMInitArgs; + +typedef struct JavaVMAttachArgs { + jint version; + + char *name; + jobject group; +} JavaVMAttachArgs; + +/* These structures will be VM-specific. */ + +typedef struct JDK1_1InitArgs { + jint version; + + char **properties; + jint checkSource; + jint nativeStackSize; + jint javaStackSize; + jint minHeapSize; + jint maxHeapSize; + jint verifyMode; + char *classpath; + + jint (JNICALL *vfprintf)(FILE *fp, const char *format, va_list args); + void (JNICALL *exit)(jint code); + void (JNICALL *abort)(void); + + jint enableClassGC; + jint enableVerboseGC; + jint disableAsyncGC; + jint verbose; + jboolean debugging; + jint debugPort; +} JDK1_1InitArgs; + +typedef struct JDK1_1AttachArgs { + void * __padding; /* C compilers don't allow empty structures. */ +} JDK1_1AttachArgs; + +#define JDK1_2 +#define JDK1_4 + +/* End VM-specific. */ + +struct JNIInvokeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + + jint (JNICALL *DestroyJavaVM)(JavaVM *vm); + + jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args); + + jint (JNICALL *DetachCurrentThread)(JavaVM *vm); + + jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version); + + jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args); +}; + +struct JavaVM_ { + const struct JNIInvokeInterface_ *functions; +#ifdef __cplusplus + + jint DestroyJavaVM() { + return functions->DestroyJavaVM(this); + } + jint AttachCurrentThread(void **penv, void *args) { + return functions->AttachCurrentThread(this, penv, args); + } + jint DetachCurrentThread() { + return functions->DetachCurrentThread(this); + } + + jint GetEnv(void **penv, jint version) { + return functions->GetEnv(this, penv, version); + } + jint AttachCurrentThreadAsDaemon(void **penv, void *args) { + return functions->AttachCurrentThreadAsDaemon(this, penv, args); + } +#endif +}; + +#ifdef _JNI_IMPLEMENTATION_ +#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT +#else +#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT +#endif +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_GetDefaultJavaVMInitArgs(void *args); + +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args); + +_JNI_IMPORT_OR_EXPORT_ jint JNICALL +JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); + +/* Defined by native libraries. */ +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM *vm, void *reserved); + +JNIEXPORT void JNICALL +JNI_OnUnload(JavaVM *vm, void *reserved); + +#define JNI_VERSION_1_1 0x00010001 +#define JNI_VERSION_1_2 0x00010002 +#define JNI_VERSION_1_4 0x00010004 + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !_JAVASOFT_JNI_H_ */ diff --git a/jansi/src/main/lib/inc_win/jni_md.h b/jansi/src/main/lib/inc_win/jni_md.h new file mode 100644 index 00000000..26a733df --- /dev/null +++ b/jansi/src/main/lib/inc_win/jni_md.h @@ -0,0 +1,19 @@ +/* + * @(#)jni_md.h 1.14 03/12/19 + * + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +#ifndef _JAVASOFT_JNI_MD_H_ +#define _JAVASOFT_JNI_MD_H_ + +#define JNIEXPORT __declspec(dllexport) +#define JNIIMPORT __declspec(dllimport) +#define JNICALL __stdcall + +typedef long jint; +typedef __int64 jlong; +typedef signed char jbyte; + +#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/jansi/src/main/native/hawtjni.c b/jansi/src/main/native/hawtjni.c new file mode 100644 index 00000000..6211fadb --- /dev/null +++ b/jansi/src/main/native/hawtjni.c @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +#include "hawtjni.h" +#include +#include +#include + +int IS_JNI_1_2 = 0; + +#ifdef JNI_VERSION_1_2 +JavaVM *JVM; + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { + IS_JNI_1_2 = 1; + JVM = vm; + return JNI_VERSION_1_2; +} +#endif + diff --git a/jansi/src/main/native/hawtjni.h b/jansi/src/main/native/hawtjni.h new file mode 100644 index 00000000..fcc8984c --- /dev/null +++ b/jansi/src/main/native/hawtjni.h @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +/** + * hawtjni.h + * + * This file contains the global macro declarations for a hawtjni based + * library. + * + */ +#ifndef INC_HAWTJNI_H +#define INC_HAWTJNI_H +#define _MULTI_THREADED + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "jni.h" +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +extern int IS_JNI_1_2; + +#ifndef JNI64 +#if defined(_LP64) +#define JNI64 +#endif +#endif + +/* 64 bit support */ +#ifndef JNI64 + +/* int/long defines */ +#define GetIntLongField GetIntField +#define SetIntLongField SetIntField +#define GetIntLongArrayElements GetIntArrayElements +#define ReleaseIntLongArrayElements ReleaseIntArrayElements +#define GetIntLongArrayRegion GetIntArrayRegion +#define SetIntLongArrayRegion SetIntArrayRegion +#define NewIntLongArray NewIntArray +#define CallStaticIntLongMethod CallStaticIntMethod +#define CallIntLongMethod CallIntMethod +#define CallStaticIntLongMethodV CallStaticIntMethodV +#define CallIntLongMethodV CallIntMethodV +#define jintLongArray jintArray +#define jintLong jint +#define I_J "I" +#define I_JArray "[I" + +/* float/double defines */ +#define GetFloatDoubleField GetFloatField +#define SetFloatDoubleField SetFloatField +#define GetFloatDoubleArrayElements GetFloatArrayElements +#define ReleaseFloatDoubleArrayElements ReleaseFloatArrayElements +#define GetFloatDoubleArrayRegion GetFloatArrayRegion +#define jfloatDoubleArray jfloatArray +#define jfloatDouble jfloat +#define F_D "F" +#define F_DArray "[F" + +#else + +/* int/long defines */ +#define GetIntLongField GetLongField +#define SetIntLongField SetLongField +#define GetIntLongArrayElements GetLongArrayElements +#define ReleaseIntLongArrayElements ReleaseLongArrayElements +#define GetIntLongArrayRegion GetLongArrayRegion +#define SetIntLongArrayRegion SetLongArrayRegion +#define NewIntLongArray NewLongArray +#define CallStaticIntLongMethod CallStaticLongMethod +#define CallIntLongMethod CallLongMethod +#define CallStaticIntLongMethodV CallStaticLongMethodV +#define CallIntLongMethodV CallLongMethodV +#define jintLongArray jlongArray +#define jintLong jlong +#define I_J "J" +#define I_JArray "[J" + +/* float/double defines */ +#define GetFloatDoubleField GetDoubleField +#define SetFloatDoubleField SetDoubleField +#define GetFloatDoubleArrayElements GetDoubleArrayElements +#define ReleaseFloatDoubleArrayElements ReleaseDoubleArrayElements +#define GetFloatDoubleArrayRegion GetDoubleArrayRegion +#define jfloatDoubleArray jdoubleArray +#define jfloatDouble jdouble +#define F_D "D" +#define F_DArray "[D" + +#endif + + +#ifdef JNI_VERSION_1_2 +extern JavaVM *JVM; +#endif + +#ifdef __GNUC__ + #define hawtjni_w_barrier() __sync_synchronize() +#elif defined(SOLARIS2) && SOLARIS2 >= 10 + #include + #define hawtjni_w_barrier() __machine_w_barrier() +#elif defined(__APPLE__) + #include + #define hawtjni_w_barrier() OSMemoryBarrier() +#elif defined(_WIN32) || defined(_WIN64) + #include + #define hawtjni_w_barrier() _mm_sfence(); _WriteBarrier() +#else + #pragma message ( "Don't know how to do a memory barrier on this platform" ) + #define hawtjni_w_barrier() +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef INC_HAWTJNI_H */ diff --git a/jansi/src/main/native/jansi.c b/jansi/src/main/native/jansi.c new file mode 100644 index 00000000..b72e4d48 --- /dev/null +++ b/jansi/src/main/native/jansi.c @@ -0,0 +1,713 @@ +/******************************************************************************* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +#include "jansi.h" +#include "hawtjni.h" +#include "jansi_structs.h" + +#define CLibrary_NATIVE(func) Java_org_fusesource_jansi_internal_CLibrary_##func + +JNIEXPORT void JNICALL CLibrary_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(HAVE_ISATTY) + (*env)->SetStaticBooleanField(env, that, (*env)->GetStaticFieldID(env, that, "HAVE_ISATTY", "Z"), (jboolean)1); +#endif +#if defined(HAVE_TTYNAME) + (*env)->SetStaticBooleanField(env, that, (*env)->GetStaticFieldID(env, that, "HAVE_TTYNAME", "Z"), (jboolean)1); +#endif +#if defined(TCSANOW) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "TCSANOW", "I"), (jint)TCSANOW); +#endif +#if defined(TCSADRAIN) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "TCSADRAIN", "I"), (jint)TCSADRAIN); +#endif +#if defined(TCSAFLUSH) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "TCSAFLUSH", "I"), (jint)TCSAFLUSH); +#endif +#if defined(TIOCGETA) + (*env)->SetStaticLongField(env, that, (*env)->GetStaticFieldID(env, that, "TIOCGETA", "J"), (jlong)TIOCGETA); +#endif +#if defined(TIOCSETA) + (*env)->SetStaticLongField(env, that, (*env)->GetStaticFieldID(env, that, "TIOCSETA", "J"), (jlong)TIOCSETA); +#endif +#if defined(TIOCGETD) + (*env)->SetStaticLongField(env, that, (*env)->GetStaticFieldID(env, that, "TIOCGETD", "J"), (jlong)TIOCGETD); +#endif +#if defined(TIOCSETD) + (*env)->SetStaticLongField(env, that, (*env)->GetStaticFieldID(env, that, "TIOCSETD", "J"), (jlong)TIOCSETD); +#endif +#if defined(TIOCGWINSZ) + (*env)->SetStaticLongField(env, that, (*env)->GetStaticFieldID(env, that, "TIOCGWINSZ", "J"), (jlong)TIOCGWINSZ); +#endif +#if defined(TIOCSWINSZ) + (*env)->SetStaticLongField(env, that, (*env)->GetStaticFieldID(env, that, "TIOCSWINSZ", "J"), (jlong)TIOCSWINSZ); +#endif + return; +} +#if defined(HAVE_IOCTL) +JNIEXPORT jint JNICALL CLibrary_NATIVE(ioctl__IJLorg_fusesource_jansi_internal_CLibrary_00024WinSize_2) + (JNIEnv *env, jclass that, jint arg0, jlong arg1, jobject arg2) +{ + struct winsize _arg2, *lparg2=NULL; + jint rc = 0; + + if (arg2) if ((lparg2 = getWinSizeFields(env, arg2, &_arg2)) == NULL) goto fail; + rc = (jint)ioctl(arg0, arg1, (intptr_t)lparg2); +fail: + if (arg2 && lparg2) setWinSizeFields(env, arg2, lparg2); + + return rc; +} +#endif + +#if defined(HAVE_IOCTL) +JNIEXPORT jint JNICALL CLibrary_NATIVE(ioctl__IJ_3I) + (JNIEnv *env, jclass that, jint arg0, jlong arg1, jintArray arg2) +{ + jint *lparg2=NULL; + jint rc = 0; + + if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail; + rc = (jint)ioctl(arg0, arg1, lparg2); +fail: + if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0); + + return rc; +} +#endif + +#if FALSE +JNIEXPORT jint JNICALL CLibrary_NATIVE(isatty) + (JNIEnv *env, jclass that, jint arg0) +{ + jint rc = 0; + + rc = (jint)isatty(arg0); + + return rc; +} +#endif + +#if defined(HAVE_OPENPTY) +JNIEXPORT jint JNICALL CLibrary_NATIVE(openpty) + (JNIEnv *env, jclass that, jintArray arg0, jintArray arg1, jbyteArray arg2, jobject arg3, jobject arg4) +{ + jint *lparg0=NULL; + jint *lparg1=NULL; + jbyte *lparg2=NULL; + struct termios _arg3, *lparg3=NULL; + struct winsize _arg4, *lparg4=NULL; + jint rc = 0; + + if (arg0) if ((lparg0 = (*env)->GetIntArrayElements(env, arg0, NULL)) == NULL) goto fail; + if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail; + if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail; + if (arg3) if ((lparg3 = getTermiosFields(env, arg3, &_arg3)) == NULL) goto fail; + if (arg4) if ((lparg4 = getWinSizeFields(env, arg4, &_arg4)) == NULL) goto fail; + rc = (jint)openpty((int *)lparg0, (int *)lparg1, (char *)lparg2, (struct termios *)lparg3, (struct winsize *)lparg4); +fail: + if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0); + if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0); + if (arg0 && lparg0) (*env)->ReleaseIntArrayElements(env, arg0, lparg0, 0); + + return rc; +} +#endif + +#if defined(HAVE_TCGETATTR) +JNIEXPORT jint JNICALL CLibrary_NATIVE(tcgetattr) + (JNIEnv *env, jclass that, jint arg0, jobject arg1) +{ + struct termios _arg1, *lparg1=NULL; + jint rc = 0; + + if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail; + rc = (jint)tcgetattr(arg0, (struct termios *)lparg1); +fail: + if (arg1 && lparg1) setTermiosFields(env, arg1, lparg1); + + return rc; +} +#endif + +#if defined(HAVE_TCSETATTR) +JNIEXPORT jint JNICALL CLibrary_NATIVE(tcsetattr) + (JNIEnv *env, jclass that, jint arg0, jint arg1, jobject arg2) +{ + struct termios _arg2, *lparg2=NULL; + jint rc = 0; + + if (arg2) if ((lparg2 = getTermiosFields(env, arg2, &_arg2)) == NULL) goto fail; + rc = (jint)tcsetattr(arg0, arg1, (struct termios *)lparg2); +fail: + + return rc; +} +#endif + +#if FALSE +JNIEXPORT jstring JNICALL CLibrary_NATIVE(ttyname) + (JNIEnv *env, jclass that, jint arg0) +{ + jstring rc = 0; + + rc = (jstring)ttyname(arg0); + + return rc; +} +#endif + +#define Termios_NATIVE(func) Java_org_fusesource_jansi_internal_CLibrary_00024Termios_##func + +JNIEXPORT void JNICALL Termios_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(HAVE_IOCTL) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(struct termios)); +#endif + return; +} +#define WinSize_NATIVE(func) Java_org_fusesource_jansi_internal_CLibrary_00024WinSize_##func + +JNIEXPORT void JNICALL WinSize_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(HAVE_IOCTL) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(struct winsize)); +#endif + return; +} +#define Kernel32_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_##func + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(CloseHandle) + (JNIEnv *env, jclass that, jlong arg0) +{ + jint rc = 0; + rc = (jint)CloseHandle((HANDLE)arg0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(FillConsoleOutputAttribute) + (JNIEnv *env, jclass that, jlong arg0, jshort arg1, jint arg2, jobject arg3, jintArray arg4) +{ + COORD _arg3, *lparg3=NULL; + jint *lparg4=NULL; + jint rc = 0; + if (arg3) if ((lparg3 = getCOORDFields(env, arg3, &_arg3)) == NULL) goto fail; + if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail; + rc = (jint)FillConsoleOutputAttribute((HANDLE)(intptr_t)arg0, arg1, arg2, *lparg3, lparg4); +fail: + if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(FillConsoleOutputCharacterW) + (JNIEnv *env, jclass that, jlong arg0, jchar arg1, jint arg2, jobject arg3, jintArray arg4) +{ + COORD _arg3, *lparg3=NULL; + jint *lparg4=NULL; + jint rc = 0; + if (arg3) if ((lparg3 = getCOORDFields(env, arg3, &_arg3)) == NULL) goto fail; + if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail; + rc = (jint)FillConsoleOutputCharacterW((HANDLE)(intptr_t)arg0, arg1, arg2, *lparg3, lparg4); +fail: + if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(FlushConsoleInputBuffer) + (JNIEnv *env, jclass that, jlong arg0) +{ + jint rc = 0; + rc = (jint)FlushConsoleInputBuffer((HANDLE)(intptr_t)arg0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(FormatMessageW) + (JNIEnv *env, jclass that, jint arg0, jlong arg1, jint arg2, jint arg3, jbyteArray arg4, jint arg5, jlongArray arg6) +{ + jbyte *lparg4=NULL; + jlong *lparg6=NULL; + jint rc = 0; +#ifdef JNI_VERSION_1_2 + if (IS_JNI_1_2) { + if (arg4) if ((lparg4 = (*env)->GetPrimitiveArrayCritical(env, arg4, NULL)) == NULL) goto fail; + if (arg6) if ((lparg6 = (*env)->GetPrimitiveArrayCritical(env, arg6, NULL)) == NULL) goto fail; + } else +#endif + { + if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail; + if (arg6) if ((lparg6 = (*env)->GetLongArrayElements(env, arg6, NULL)) == NULL) goto fail; + } + rc = (jint)FormatMessageW(arg0, (void *)(intptr_t)arg1, arg2, arg3, (void *)lparg4, arg5, (void *)NULL); +fail: +#ifdef JNI_VERSION_1_2 + if (IS_JNI_1_2) { + if (arg6 && lparg6) (*env)->ReleasePrimitiveArrayCritical(env, arg6, lparg6, 0); + if (arg4 && lparg4) (*env)->ReleasePrimitiveArrayCritical(env, arg4, lparg4, 0); + } else +#endif + { + if (arg6 && lparg6) (*env)->ReleaseLongArrayElements(env, arg6, lparg6, 0); + if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, 0); + } + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(GetConsoleMode) + (JNIEnv *env, jclass that, jlong arg0, jintArray arg1) +{ + jint *lparg1=NULL; + jint rc = 0; + if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail; + rc = (jint)GetConsoleMode((HANDLE)(intptr_t)arg0, lparg1); +fail: + if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(GetConsoleOutputCP) + (JNIEnv *env, jclass that) +{ + jint rc = 0; + rc = (jint)GetConsoleOutputCP(); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(GetConsoleScreenBufferInfo) + (JNIEnv *env, jclass that, jlong arg0, jobject arg1) +{ + CONSOLE_SCREEN_BUFFER_INFO _arg1, *lparg1=NULL; + jint rc = 0; + if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail; + rc = (jint)GetConsoleScreenBufferInfo((HANDLE)(intptr_t)arg0, lparg1); +fail: + if (arg1 && lparg1) setCONSOLE_SCREEN_BUFFER_INFOFields(env, arg1, lparg1); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(GetLastError) + (JNIEnv *env, jclass that) +{ + jint rc = 0; + rc = (jint)GetLastError(); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(GetNumberOfConsoleInputEvents) + (JNIEnv *env, jclass that, jlong arg0, jintArray arg1) +{ + jint *lparg1=NULL; + jint rc = 0; + if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail; + rc = (jint)GetNumberOfConsoleInputEvents((HANDLE)(intptr_t)arg0, lparg1); +fail: + if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jlong JNICALL Kernel32_NATIVE(GetStdHandle) + (JNIEnv *env, jclass that, jint arg0) +{ + jlong rc = 0; + rc = (intptr_t)(HANDLE)GetStdHandle(arg0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(PeekConsoleInputW) + (JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jintArray arg3) +{ + jint *lparg3=NULL; + jint rc = 0; + if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail; + rc = (jint)PeekConsoleInputW((HANDLE)(intptr_t)arg0, (PINPUT_RECORD)(intptr_t)arg1, arg2, lparg3); +fail: + if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(ReadConsoleInputW) + (JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jintArray arg3) +{ + jint *lparg3=NULL; + jint rc = 0; + if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail; + rc = (jint)ReadConsoleInputW((HANDLE)(intptr_t)arg0, (PINPUT_RECORD)(intptr_t)arg1, arg2, lparg3); +fail: + if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(ScrollConsoleScreenBuffer) + (JNIEnv *env, jclass that, jlong arg0, jobject arg1, jobject arg2, jobject arg3, jobject arg4) +{ + SMALL_RECT _arg1, *lparg1=NULL; + SMALL_RECT _arg2, *lparg2=NULL; + COORD _arg3, *lparg3=NULL; + CHAR_INFO _arg4, *lparg4=NULL; + jint rc = 0; + if (arg1) if ((lparg1 = getSMALL_RECTFields(env, arg1, &_arg1)) == NULL) goto fail; + if (arg2) if ((lparg2 = getSMALL_RECTFields(env, arg2, &_arg2)) == NULL) goto fail; + if (arg3) if ((lparg3 = getCOORDFields(env, arg3, &_arg3)) == NULL) goto fail; + if (arg4) if ((lparg4 = getCHAR_INFOFields(env, arg4, &_arg4)) == NULL) goto fail; + rc = (jint)ScrollConsoleScreenBuffer((HANDLE)(intptr_t)arg0, lparg1, lparg2, *lparg3, lparg4); +fail: + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(SetConsoleCursorPosition) + (JNIEnv *env, jclass that, jlong arg0, jobject arg1) +{ + COORD _arg1, *lparg1=NULL; + jint rc = 0; + if (arg1) if ((lparg1 = getCOORDFields(env, arg1, &_arg1)) == NULL) goto fail; + rc = (jint)SetConsoleCursorPosition((HANDLE)(intptr_t)arg0, *lparg1); +fail: + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(SetConsoleMode) + (JNIEnv *env, jclass that, jlong arg0, jint arg1) +{ + return (jint)SetConsoleMode((HANDLE)(intptr_t)arg0, arg1); +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(SetConsoleOutputCP) + (JNIEnv *env, jclass that, jint arg0) +{ + return (jint)SetConsoleOutputCP(arg0); +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(SetConsoleTextAttribute) + (JNIEnv *env, jclass that, jlong arg0, jshort arg1) +{ + return (jint)SetConsoleTextAttribute((HANDLE)arg0, arg1); +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(SetConsoleTitle) + (JNIEnv *env, jclass that, jstring arg0) +{ + const jchar *lparg0= NULL; + jint rc = 0; + if (arg0) if ((lparg0 = (*env)->GetStringChars(env, arg0, NULL)) == NULL) goto fail; + rc = (jint)SetConsoleTitle(lparg0); +fail: + if (arg0 && lparg0) (*env)->ReleaseStringChars(env, arg0, lparg0); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(WaitForSingleObject) + (JNIEnv *env, jclass that, jlong arg0, jint arg1) +{ + return (jint)WaitForSingleObject((HANDLE)arg0, arg1); +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(WriteConsoleW) + (JNIEnv *env, jclass that, jlong arg0, jcharArray arg1, jint arg2, jintArray arg3, jlong arg4) +{ + jchar *lparg1=NULL; + jint *lparg3=NULL; + jint rc = 0; + if (arg1) if ((lparg1 = (*env)->GetCharArrayElements(env, arg1, NULL)) == NULL) goto fail; + if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail; + rc = (jint)WriteConsoleW((HANDLE)(intptr_t)arg0, lparg1, arg2, lparg3, (LPVOID)(intptr_t)arg4); +fail: + if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0); + if (arg1 && lparg1) (*env)->ReleaseCharArrayElements(env, arg1, lparg1, JNI_ABORT); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jint JNICALL Kernel32_NATIVE(_1getch) + (JNIEnv *env, jclass that) +{ + jint rc = 0; + rc = (jint)getch(); + return rc; +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT void JNICALL Kernel32_NATIVE(free) + (JNIEnv *env, jclass that, jlong arg0) +{ + free((void *)(intptr_t)arg0); +} +#endif + +JNIEXPORT void JNICALL Kernel32_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "FOREGROUND_BLUE", "S"), (jshort)FOREGROUND_BLUE); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "FOREGROUND_GREEN", "S"), (jshort)FOREGROUND_GREEN); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "FOREGROUND_RED", "S"), (jshort)FOREGROUND_RED); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "FOREGROUND_INTENSITY", "S"), (jshort)FOREGROUND_INTENSITY); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "BACKGROUND_BLUE", "S"), (jshort)BACKGROUND_BLUE); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "BACKGROUND_GREEN", "S"), (jshort)BACKGROUND_GREEN); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "BACKGROUND_RED", "S"), (jshort)BACKGROUND_RED); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "BACKGROUND_INTENSITY", "S"), (jshort)BACKGROUND_INTENSITY); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "COMMON_LVB_LEADING_BYTE", "S"), (jshort)COMMON_LVB_LEADING_BYTE); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "COMMON_LVB_TRAILING_BYTE", "S"), (jshort)COMMON_LVB_TRAILING_BYTE); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "COMMON_LVB_GRID_HORIZONTAL", "S"), (jshort)COMMON_LVB_GRID_HORIZONTAL); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "COMMON_LVB_GRID_LVERTICAL", "S"), (jshort)COMMON_LVB_GRID_LVERTICAL); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "COMMON_LVB_GRID_RVERTICAL", "S"), (jshort)COMMON_LVB_GRID_RVERTICAL); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "COMMON_LVB_REVERSE_VIDEO", "S"), (jshort)COMMON_LVB_REVERSE_VIDEO); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "COMMON_LVB_UNDERSCORE", "S"), (jshort)COMMON_LVB_UNDERSCORE); + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "FORMAT_MESSAGE_FROM_SYSTEM", "I"), (jint)FORMAT_MESSAGE_FROM_SYSTEM); + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "STD_INPUT_HANDLE", "I"), (jint)STD_INPUT_HANDLE); + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "STD_OUTPUT_HANDLE", "I"), (jint)STD_OUTPUT_HANDLE); + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "STD_ERROR_HANDLE", "I"), (jint)STD_ERROR_HANDLE); + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "INVALID_HANDLE_VALUE", "I"), (jint)INVALID_HANDLE_VALUE); +#endif + return; +} +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT jlong JNICALL Kernel32_NATIVE(malloc) + (JNIEnv *env, jclass that, jlong arg0) +{ + jlong rc = 0; + rc = (intptr_t)(void *)malloc((size_t)arg0); + return rc; +} +#endif + +#define CHAR_INFO_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024CHAR_1INFO_##func + +JNIEXPORT void JNICALL CHAR_INFO_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(CHAR_INFO)); +#endif + return; +} +#define CONSOLE_SCREEN_BUFFER_INFO_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024CONSOLE_1SCREEN_1BUFFER_1INFO_##func + +JNIEXPORT void JNICALL CONSOLE_SCREEN_BUFFER_INFO_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(CONSOLE_SCREEN_BUFFER_INFO)); +#endif + return; +} +#define COORD_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024COORD_##func + +JNIEXPORT void JNICALL COORD_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(COORD)); +#endif + return; +} +#define FOCUS_EVENT_RECORD_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024FOCUS_1EVENT_1RECORD_##func + +JNIEXPORT void JNICALL FOCUS_EVENT_RECORD_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(WINDOW_BUFFER_SIZE_RECORD)); +#endif + return; +} +#define INPUT_RECORD_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024INPUT_1RECORD_##func + +JNIEXPORT void JNICALL INPUT_RECORD_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(INPUT_RECORD)); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "KEY_EVENT", "S"), (jshort)KEY_EVENT); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "MOUSE_EVENT", "S"), (jshort)MOUSE_EVENT); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "WINDOW_BUFFER_SIZE_EVENT", "S"), (jshort)WINDOW_BUFFER_SIZE_EVENT); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "FOCUS_EVENT", "S"), (jshort)FOCUS_EVENT); + (*env)->SetStaticShortField(env, that, (*env)->GetStaticFieldID(env, that, "MENU_EVENT", "S"), (jshort)MENU_EVENT); +#endif + return; +} +#if defined(_WIN32) || defined(_WIN64) +JNIEXPORT void JNICALL INPUT_RECORD_NATIVE(memmove) + (JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2) +{ + INPUT_RECORD _arg0, *lparg0=NULL; + if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail; + memmove((void *)lparg0, (const void *)(intptr_t)arg1, (size_t)arg2); +fail: + if (arg0 && lparg0) setINPUT_RECORDFields(env, arg0, lparg0); +} +#endif + +#define KEY_EVENT_RECORD_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024KEY_1EVENT_1RECORD_##func + +JNIEXPORT void JNICALL KEY_EVENT_RECORD_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(KEY_EVENT_RECORD)); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "CAPSLOCK_ON", "I"), (jint)CAPSLOCK_ON); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "NUMLOCK_ON", "I"), (jint)NUMLOCK_ON); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SCROLLLOCK_ON", "I"), (jint)SCROLLLOCK_ON); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "ENHANCED_KEY", "I"), (jint)ENHANCED_KEY); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "LEFT_ALT_PRESSED", "I"), (jint)LEFT_ALT_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "LEFT_CTRL_PRESSED", "I"), (jint)LEFT_CTRL_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "RIGHT_ALT_PRESSED", "I"), (jint)RIGHT_ALT_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "RIGHT_CTRL_PRESSED", "I"), (jint)RIGHT_CTRL_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SHIFT_PRESSED", "I"), (jint)SHIFT_PRESSED); +#endif + return; +} +#define MENU_EVENT_RECORD_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024MENU_1EVENT_1RECORD_##func + +JNIEXPORT void JNICALL MENU_EVENT_RECORD_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(MENU_EVENT_RECORD)); +#endif + return; +} +#define MOUSE_EVENT_RECORD_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024MOUSE_1EVENT_1RECORD_##func + +JNIEXPORT void JNICALL MOUSE_EVENT_RECORD_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(MOUSE_EVENT_RECORD)); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "FROM_LEFT_1ST_BUTTON_PRESSED", "I"), (jint)FROM_LEFT_1ST_BUTTON_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "FROM_LEFT_2ND_BUTTON_PRESSED", "I"), (jint)FROM_LEFT_2ND_BUTTON_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "FROM_LEFT_3RD_BUTTON_PRESSED", "I"), (jint)FROM_LEFT_3RD_BUTTON_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "FROM_LEFT_4TH_BUTTON_PRESSED", "I"), (jint)FROM_LEFT_4TH_BUTTON_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "RIGHTMOST_BUTTON_PRESSED", "I"), (jint)RIGHTMOST_BUTTON_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "CAPSLOCK_ON", "I"), (jint)CAPSLOCK_ON); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "NUMLOCK_ON", "I"), (jint)NUMLOCK_ON); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SCROLLLOCK_ON", "I"), (jint)SCROLLLOCK_ON); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "ENHANCED_KEY", "I"), (jint)ENHANCED_KEY); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "LEFT_ALT_PRESSED", "I"), (jint)LEFT_ALT_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "LEFT_CTRL_PRESSED", "I"), (jint)LEFT_CTRL_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "RIGHT_ALT_PRESSED", "I"), (jint)RIGHT_ALT_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "RIGHT_CTRL_PRESSED", "I"), (jint)RIGHT_CTRL_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SHIFT_PRESSED", "I"), (jint)SHIFT_PRESSED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "DOUBLE_CLICK", "I"), (jint)DOUBLE_CLICK); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "MOUSE_HWHEELED", "I"), (jint)MOUSE_HWHEELED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "MOUSE_MOVED", "I"), (jint)MOUSE_MOVED); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "MOUSE_WHEELED", "I"), (jint)MOUSE_WHEELED); +#endif + return; +} +#define SMALL_RECT_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024SMALL_1RECT_##func + +JNIEXPORT void JNICALL SMALL_RECT_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(SMALL_RECT)); +#endif + return; +} +#define WINDOW_BUFFER_SIZE_RECORD_NATIVE(func) Java_org_fusesource_jansi_internal_Kernel32_00024WINDOW_1BUFFER_1SIZE_1RECORD_##func + +JNIEXPORT void JNICALL WINDOW_BUFFER_SIZE_RECORD_NATIVE(init)(JNIEnv *env, jclass that) +{ +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetStaticIntField(env, that, (*env)->GetStaticFieldID(env, that, "SIZEOF", "I"), (jint)sizeof(WINDOW_BUFFER_SIZE_RECORD)); +#endif + return; +} diff --git a/jansi/src/main/native/jansi.h b/jansi/src/main/native/jansi.h new file mode 100644 index 00000000..992c7d6d --- /dev/null +++ b/jansi/src/main/native/jansi.h @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +#ifndef JANSI_H +#define JANSI_H + +#ifdef HAVE_CONFIG_H + /* configure based build.. we will use what it discovered about the platform */ + #include "config.h" +#else + #if defined(_WIN32) || defined(_WIN64) + /* Windows based build */ + #define HAVE_STDLIB_H 1 + #define HAVE_STRINGS_H 1 + + #define STDIN_FILENO 0 + #define STDOUT_FILENO 1 + #define STDERR_FILENO 2 + #define HAVE_ISATTY + + #include + #include + #include + + #define isatty _isatty + #define getch _getch + + #ifndef MOUSE_HWHEELED + #define MOUSE_HWHEELED 0x0008 + #endif + + #endif +#endif + +#ifdef HAVE_UNISTD_H + #include +#endif + +#ifdef HAVE_STDLIB_H + #include +#endif + +#ifdef HAVE_STRINGS_H + #include +#endif + +#ifdef HAVE_JANSI_TERM_H + #include +#endif + +#ifdef HAVE_JANSI_LIBUTIL_H + #include +#endif + +#ifdef HAVE_JANSI_UTIL_H + #include +#endif + +#ifdef HAVE_TERMIOS_H + #include +#endif + +#ifdef HAVE_IOCTL_H + #include +#endif + +#ifdef HAVE_PTY_H + #include +#endif + + +#endif /* JANSI_H */ diff --git a/jansi/src/main/native/jansi_isatty.c b/jansi/src/main/native/jansi_isatty.c new file mode 100644 index 00000000..8a1acd8b --- /dev/null +++ b/jansi/src/main/native/jansi_isatty.c @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (C) 2017, the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +#include "jansi.h" +#include "hawtjni.h" +#include "jansi_structs.h" + +#define CLibrary_NATIVE(func) Java_org_fusesource_jansi_internal_CLibrary_##func + +#if defined(_WIN32) || defined(_WIN64) + +typedef struct _FILE_NAME_INFORMATION { + uint16_t FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + + +typedef enum { + ObjectBasicInformation, + ObjectNameInformation, + ObjectTypeInformation, + ObjectAllInformation, + ObjectDataInformation +} OBJECT_INFORMATION_CLASS; + +typedef NTSTATUS (NTAPI *TFNNtQueryObject)(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG); +TFNNtQueryObject NtQueryObject = 0; + +HANDLE hModuleNtDll = 0; + +JNIEXPORT jint JNICALL CLibrary_NATIVE(isatty) + (JNIEnv *env, jclass that, jint arg0) +{ + jint rc; + + ULONG result; + BYTE buffer[1024]; + PFILE_NAME_INFORMATION nameinfo = (PFILE_NAME_INFORMATION) buffer; + PWSTR name; + + /* check if fd is a pipe */ + HANDLE h = (HANDLE) _get_osfhandle(arg0); + DWORD t = GetFileType(h); + if (t == FILE_TYPE_CHAR) { + rc = 1; + } + else if (t != FILE_TYPE_PIPE) { + rc = 0; + } + else { + if (hModuleNtDll == 0) { + hModuleNtDll = LoadLibraryW(L"ntdll.dll"); + } + if (hModuleNtDll == 0) { + rc = 0; + } + else { + if (NtQueryObject == 0) { + NtQueryObject = (TFNNtQueryObject) GetProcAddress(hModuleNtDll, "NtQueryObject"); + } + if (NtQueryObject == 0) { + rc = 0; + } + /* get pipe name */ + else if (NtQueryObject(h, ObjectNameInformation, buffer, sizeof(buffer) - 2, &result) != 0) { + rc = 0; + } + else { + + name = nameinfo->FileName; + name[nameinfo->FileNameLength / sizeof(*name)] = 0; + + /* + * Check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX') + * or a cygwin pty pipe ('cygwin-XXXX-ptyN-XX') + */ + if ((!wcsstr(name, L"msys-") && !wcsstr(name, L"cygwin-")) + || !wcsstr(name, L"-pty")) { + rc = 1; + } else { + rc = 0; + } + } + } + } + + return rc; +} + +#else +#if defined(HAVE_ISATTY) + +JNIEXPORT jint JNICALL CLibrary_NATIVE(isatty) + (JNIEnv *env, jclass that, jint arg0) +{ + jint rc = 0; + + rc = (jint)isatty(arg0); + + return rc; +} + +#endif +#endif diff --git a/jansi/src/main/native/jansi_structs.c b/jansi/src/main/native/jansi_structs.c new file mode 100644 index 00000000..46ad5b6e --- /dev/null +++ b/jansi/src/main/native/jansi_structs.c @@ -0,0 +1,740 @@ +/******************************************************************************* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +#include "jansi.h" +#include "hawtjni.h" +#include "jansi_structs.h" + +#if defined(HAVE_IOCTL) +typedef struct Termios_FID_CACHE { + int cached; + jclass clazz; + jfieldID c_iflag, c_oflag, c_cflag, c_lflag, c_cc, c_ispeed, c_ospeed; +} Termios_FID_CACHE; + +Termios_FID_CACHE TermiosFc; + +void cacheTermiosFields(JNIEnv *env, jobject lpObject) +{ + if (TermiosFc.cached) return; + TermiosFc.clazz = (*env)->GetObjectClass(env, lpObject); + TermiosFc.c_iflag = (*env)->GetFieldID(env, TermiosFc.clazz, "c_iflag", "J"); + TermiosFc.c_oflag = (*env)->GetFieldID(env, TermiosFc.clazz, "c_oflag", "J"); + TermiosFc.c_cflag = (*env)->GetFieldID(env, TermiosFc.clazz, "c_cflag", "J"); + TermiosFc.c_lflag = (*env)->GetFieldID(env, TermiosFc.clazz, "c_lflag", "J"); + TermiosFc.c_cc = (*env)->GetFieldID(env, TermiosFc.clazz, "c_cc", "[B"); + TermiosFc.c_ispeed = (*env)->GetFieldID(env, TermiosFc.clazz, "c_ispeed", "J"); + TermiosFc.c_ospeed = (*env)->GetFieldID(env, TermiosFc.clazz, "c_ospeed", "J"); + hawtjni_w_barrier(); + TermiosFc.cached = 1; +} + +struct termios *getTermiosFields(JNIEnv *env, jobject lpObject, struct termios *lpStruct) +{ + if (!TermiosFc.cached) cacheTermiosFields(env, lpObject); +#if defined(HAVE_IOCTL) + lpStruct->c_iflag = (*env)->GetLongField(env, lpObject, TermiosFc.c_iflag); +#endif +#if defined(HAVE_IOCTL) + lpStruct->c_oflag = (*env)->GetLongField(env, lpObject, TermiosFc.c_oflag); +#endif +#if defined(HAVE_IOCTL) + lpStruct->c_cflag = (*env)->GetLongField(env, lpObject, TermiosFc.c_cflag); +#endif +#if defined(HAVE_IOCTL) + lpStruct->c_lflag = (*env)->GetLongField(env, lpObject, TermiosFc.c_lflag); +#endif +#if defined(HAVE_IOCTL) + { + jbyteArray lpObject1 = (jbyteArray)(*env)->GetObjectField(env, lpObject, TermiosFc.c_cc); + (*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->c_cc), (jbyte *)lpStruct->c_cc); + } +#endif +#if defined(HAVE_IOCTL) + lpStruct->c_ispeed = (*env)->GetLongField(env, lpObject, TermiosFc.c_ispeed); +#endif +#if defined(HAVE_IOCTL) + lpStruct->c_ospeed = (*env)->GetLongField(env, lpObject, TermiosFc.c_ospeed); +#endif + return lpStruct; +} + +void setTermiosFields(JNIEnv *env, jobject lpObject, struct termios *lpStruct) +{ + if (!TermiosFc.cached) cacheTermiosFields(env, lpObject); +#if defined(HAVE_IOCTL) + (*env)->SetLongField(env, lpObject, TermiosFc.c_iflag, (jlong)lpStruct->c_iflag); +#endif +#if defined(HAVE_IOCTL) + (*env)->SetLongField(env, lpObject, TermiosFc.c_oflag, (jlong)lpStruct->c_oflag); +#endif +#if defined(HAVE_IOCTL) + (*env)->SetLongField(env, lpObject, TermiosFc.c_cflag, (jlong)lpStruct->c_cflag); +#endif +#if defined(HAVE_IOCTL) + (*env)->SetLongField(env, lpObject, TermiosFc.c_lflag, (jlong)lpStruct->c_lflag); +#endif +#if defined(HAVE_IOCTL) + { + jbyteArray lpObject1 = (jbyteArray)(*env)->GetObjectField(env, lpObject, TermiosFc.c_cc); + (*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->c_cc), (jbyte *)lpStruct->c_cc); + } +#endif +#if defined(HAVE_IOCTL) + (*env)->SetLongField(env, lpObject, TermiosFc.c_ispeed, (jlong)lpStruct->c_ispeed); +#endif +#if defined(HAVE_IOCTL) + (*env)->SetLongField(env, lpObject, TermiosFc.c_ospeed, (jlong)lpStruct->c_ospeed); +#endif +} +#endif + +#if defined(HAVE_IOCTL) +typedef struct WinSize_FID_CACHE { + int cached; + jclass clazz; + jfieldID ws_row, ws_col, ws_xpixel, ws_ypixel; +} WinSize_FID_CACHE; + +WinSize_FID_CACHE WinSizeFc; + +void cacheWinSizeFields(JNIEnv *env, jobject lpObject) +{ + if (WinSizeFc.cached) return; + WinSizeFc.clazz = (*env)->GetObjectClass(env, lpObject); + WinSizeFc.ws_row = (*env)->GetFieldID(env, WinSizeFc.clazz, "ws_row", "S"); + WinSizeFc.ws_col = (*env)->GetFieldID(env, WinSizeFc.clazz, "ws_col", "S"); + WinSizeFc.ws_xpixel = (*env)->GetFieldID(env, WinSizeFc.clazz, "ws_xpixel", "S"); + WinSizeFc.ws_ypixel = (*env)->GetFieldID(env, WinSizeFc.clazz, "ws_ypixel", "S"); + hawtjni_w_barrier(); + WinSizeFc.cached = 1; +} + +struct winsize *getWinSizeFields(JNIEnv *env, jobject lpObject, struct winsize *lpStruct) +{ + if (!WinSizeFc.cached) cacheWinSizeFields(env, lpObject); +#if defined(HAVE_IOCTL) + lpStruct->ws_row = (*env)->GetShortField(env, lpObject, WinSizeFc.ws_row); +#endif +#if defined(HAVE_IOCTL) + lpStruct->ws_col = (*env)->GetShortField(env, lpObject, WinSizeFc.ws_col); +#endif +#if defined(HAVE_IOCTL) + lpStruct->ws_xpixel = (*env)->GetShortField(env, lpObject, WinSizeFc.ws_xpixel); +#endif +#if defined(HAVE_IOCTL) + lpStruct->ws_ypixel = (*env)->GetShortField(env, lpObject, WinSizeFc.ws_ypixel); +#endif + return lpStruct; +} + +void setWinSizeFields(JNIEnv *env, jobject lpObject, struct winsize *lpStruct) +{ + if (!WinSizeFc.cached) cacheWinSizeFields(env, lpObject); +#if defined(HAVE_IOCTL) + (*env)->SetShortField(env, lpObject, WinSizeFc.ws_row, (jshort)lpStruct->ws_row); +#endif +#if defined(HAVE_IOCTL) + (*env)->SetShortField(env, lpObject, WinSizeFc.ws_col, (jshort)lpStruct->ws_col); +#endif +#if defined(HAVE_IOCTL) + (*env)->SetShortField(env, lpObject, WinSizeFc.ws_xpixel, (jshort)lpStruct->ws_xpixel); +#endif +#if defined(HAVE_IOCTL) + (*env)->SetShortField(env, lpObject, WinSizeFc.ws_ypixel, (jshort)lpStruct->ws_ypixel); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct CHAR_INFO_FID_CACHE { + int cached; + jclass clazz; + jfieldID attributes, unicodeChar; +} CHAR_INFO_FID_CACHE; + +CHAR_INFO_FID_CACHE CHAR_INFOFc; + +void cacheCHAR_INFOFields(JNIEnv *env, jobject lpObject) +{ + if (CHAR_INFOFc.cached) return; + CHAR_INFOFc.clazz = (*env)->GetObjectClass(env, lpObject); + CHAR_INFOFc.attributes = (*env)->GetFieldID(env, CHAR_INFOFc.clazz, "attributes", "S"); + CHAR_INFOFc.unicodeChar = (*env)->GetFieldID(env, CHAR_INFOFc.clazz, "unicodeChar", "C"); + hawtjni_w_barrier(); + CHAR_INFOFc.cached = 1; +} + +CHAR_INFO *getCHAR_INFOFields(JNIEnv *env, jobject lpObject, CHAR_INFO *lpStruct) +{ + if (!CHAR_INFOFc.cached) cacheCHAR_INFOFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + lpStruct->Attributes = (*env)->GetShortField(env, lpObject, CHAR_INFOFc.attributes); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->Char.UnicodeChar = (*env)->GetCharField(env, lpObject, CHAR_INFOFc.unicodeChar); +#endif + return lpStruct; +} + +void setCHAR_INFOFields(JNIEnv *env, jobject lpObject, CHAR_INFO *lpStruct) +{ + if (!CHAR_INFOFc.cached) cacheCHAR_INFOFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, CHAR_INFOFc.attributes, (jshort)lpStruct->Attributes); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetCharField(env, lpObject, CHAR_INFOFc.unicodeChar, (jchar)lpStruct->Char.UnicodeChar); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct CONSOLE_SCREEN_BUFFER_INFO_FID_CACHE { + int cached; + jclass clazz; + jfieldID size, cursorPosition, attributes, window, maximumWindowSize; +} CONSOLE_SCREEN_BUFFER_INFO_FID_CACHE; + +CONSOLE_SCREEN_BUFFER_INFO_FID_CACHE CONSOLE_SCREEN_BUFFER_INFOFc; + +void cacheCONSOLE_SCREEN_BUFFER_INFOFields(JNIEnv *env, jobject lpObject) +{ + if (CONSOLE_SCREEN_BUFFER_INFOFc.cached) return; + CONSOLE_SCREEN_BUFFER_INFOFc.clazz = (*env)->GetObjectClass(env, lpObject); + CONSOLE_SCREEN_BUFFER_INFOFc.size = (*env)->GetFieldID(env, CONSOLE_SCREEN_BUFFER_INFOFc.clazz, "size", "Lorg/fusesource/jansi/internal/Kernel32$COORD;"); + CONSOLE_SCREEN_BUFFER_INFOFc.cursorPosition = (*env)->GetFieldID(env, CONSOLE_SCREEN_BUFFER_INFOFc.clazz, "cursorPosition", "Lorg/fusesource/jansi/internal/Kernel32$COORD;"); + CONSOLE_SCREEN_BUFFER_INFOFc.attributes = (*env)->GetFieldID(env, CONSOLE_SCREEN_BUFFER_INFOFc.clazz, "attributes", "S"); + CONSOLE_SCREEN_BUFFER_INFOFc.window = (*env)->GetFieldID(env, CONSOLE_SCREEN_BUFFER_INFOFc.clazz, "window", "Lorg/fusesource/jansi/internal/Kernel32$SMALL_RECT;"); + CONSOLE_SCREEN_BUFFER_INFOFc.maximumWindowSize = (*env)->GetFieldID(env, CONSOLE_SCREEN_BUFFER_INFOFc.clazz, "maximumWindowSize", "Lorg/fusesource/jansi/internal/Kernel32$COORD;"); + hawtjni_w_barrier(); + CONSOLE_SCREEN_BUFFER_INFOFc.cached = 1; +} + +CONSOLE_SCREEN_BUFFER_INFO *getCONSOLE_SCREEN_BUFFER_INFOFields(JNIEnv *env, jobject lpObject, CONSOLE_SCREEN_BUFFER_INFO *lpStruct) +{ + if (!CONSOLE_SCREEN_BUFFER_INFOFc.cached) cacheCONSOLE_SCREEN_BUFFER_INFOFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.size); + if (lpObject1 != NULL) getCOORDFields(env, lpObject1, &lpStruct->dwSize); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.cursorPosition); + if (lpObject1 != NULL) getCOORDFields(env, lpObject1, &lpStruct->dwCursorPosition); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->wAttributes = (*env)->GetShortField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.attributes); +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.window); + if (lpObject1 != NULL) getSMALL_RECTFields(env, lpObject1, &lpStruct->srWindow); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.maximumWindowSize); + if (lpObject1 != NULL) getCOORDFields(env, lpObject1, &lpStruct->dwMaximumWindowSize); + } +#endif + return lpStruct; +} + +void setCONSOLE_SCREEN_BUFFER_INFOFields(JNIEnv *env, jobject lpObject, CONSOLE_SCREEN_BUFFER_INFO *lpStruct) +{ + if (!CONSOLE_SCREEN_BUFFER_INFOFc.cached) cacheCONSOLE_SCREEN_BUFFER_INFOFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.size); + if (lpObject1 != NULL) setCOORDFields(env, lpObject1, &lpStruct->dwSize); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.cursorPosition); + if (lpObject1 != NULL) setCOORDFields(env, lpObject1, &lpStruct->dwCursorPosition); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.attributes, (jshort)lpStruct->wAttributes); +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.window); + if (lpObject1 != NULL) setSMALL_RECTFields(env, lpObject1, &lpStruct->srWindow); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, CONSOLE_SCREEN_BUFFER_INFOFc.maximumWindowSize); + if (lpObject1 != NULL) setCOORDFields(env, lpObject1, &lpStruct->dwMaximumWindowSize); + } +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct COORD_FID_CACHE { + int cached; + jclass clazz; + jfieldID x, y; +} COORD_FID_CACHE; + +COORD_FID_CACHE COORDFc; + +void cacheCOORDFields(JNIEnv *env, jobject lpObject) +{ + if (COORDFc.cached) return; + COORDFc.clazz = (*env)->GetObjectClass(env, lpObject); + COORDFc.x = (*env)->GetFieldID(env, COORDFc.clazz, "x", "S"); + COORDFc.y = (*env)->GetFieldID(env, COORDFc.clazz, "y", "S"); + hawtjni_w_barrier(); + COORDFc.cached = 1; +} + +COORD *getCOORDFields(JNIEnv *env, jobject lpObject, COORD *lpStruct) +{ + if (!COORDFc.cached) cacheCOORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + lpStruct->X = (*env)->GetShortField(env, lpObject, COORDFc.x); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->Y = (*env)->GetShortField(env, lpObject, COORDFc.y); +#endif + return lpStruct; +} + +void setCOORDFields(JNIEnv *env, jobject lpObject, COORD *lpStruct) +{ + if (!COORDFc.cached) cacheCOORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, COORDFc.x, (jshort)lpStruct->X); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, COORDFc.y, (jshort)lpStruct->Y); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct FOCUS_EVENT_RECORD_FID_CACHE { + int cached; + jclass clazz; + jfieldID setFocus; +} FOCUS_EVENT_RECORD_FID_CACHE; + +FOCUS_EVENT_RECORD_FID_CACHE FOCUS_EVENT_RECORDFc; + +void cacheFOCUS_EVENT_RECORDFields(JNIEnv *env, jobject lpObject) +{ + if (FOCUS_EVENT_RECORDFc.cached) return; + FOCUS_EVENT_RECORDFc.clazz = (*env)->GetObjectClass(env, lpObject); + FOCUS_EVENT_RECORDFc.setFocus = (*env)->GetFieldID(env, FOCUS_EVENT_RECORDFc.clazz, "setFocus", "Z"); + hawtjni_w_barrier(); + FOCUS_EVENT_RECORDFc.cached = 1; +} + +FOCUS_EVENT_RECORD *getFOCUS_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, FOCUS_EVENT_RECORD *lpStruct) +{ + if (!FOCUS_EVENT_RECORDFc.cached) cacheFOCUS_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + lpStruct->bSetFocus = (*env)->GetBooleanField(env, lpObject, FOCUS_EVENT_RECORDFc.setFocus); +#endif + return lpStruct; +} + +void setFOCUS_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, FOCUS_EVENT_RECORD *lpStruct) +{ + if (!FOCUS_EVENT_RECORDFc.cached) cacheFOCUS_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetBooleanField(env, lpObject, FOCUS_EVENT_RECORDFc.setFocus, (jboolean)lpStruct->bSetFocus); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct INPUT_RECORD_FID_CACHE { + int cached; + jclass clazz; + jfieldID eventType, keyEvent, mouseEvent, windowBufferSizeEvent, menuEvent, focusEvent; +} INPUT_RECORD_FID_CACHE; + +INPUT_RECORD_FID_CACHE INPUT_RECORDFc; + +void cacheINPUT_RECORDFields(JNIEnv *env, jobject lpObject) +{ + if (INPUT_RECORDFc.cached) return; + INPUT_RECORDFc.clazz = (*env)->GetObjectClass(env, lpObject); + INPUT_RECORDFc.eventType = (*env)->GetFieldID(env, INPUT_RECORDFc.clazz, "eventType", "S"); + INPUT_RECORDFc.keyEvent = (*env)->GetFieldID(env, INPUT_RECORDFc.clazz, "keyEvent", "Lorg/fusesource/jansi/internal/Kernel32$KEY_EVENT_RECORD;"); + INPUT_RECORDFc.mouseEvent = (*env)->GetFieldID(env, INPUT_RECORDFc.clazz, "mouseEvent", "Lorg/fusesource/jansi/internal/Kernel32$MOUSE_EVENT_RECORD;"); + INPUT_RECORDFc.windowBufferSizeEvent = (*env)->GetFieldID(env, INPUT_RECORDFc.clazz, "windowBufferSizeEvent", "Lorg/fusesource/jansi/internal/Kernel32$WINDOW_BUFFER_SIZE_RECORD;"); + INPUT_RECORDFc.menuEvent = (*env)->GetFieldID(env, INPUT_RECORDFc.clazz, "menuEvent", "Lorg/fusesource/jansi/internal/Kernel32$MENU_EVENT_RECORD;"); + INPUT_RECORDFc.focusEvent = (*env)->GetFieldID(env, INPUT_RECORDFc.clazz, "focusEvent", "Lorg/fusesource/jansi/internal/Kernel32$FOCUS_EVENT_RECORD;"); + hawtjni_w_barrier(); + INPUT_RECORDFc.cached = 1; +} + +INPUT_RECORD *getINPUT_RECORDFields(JNIEnv *env, jobject lpObject, INPUT_RECORD *lpStruct) +{ + if (!INPUT_RECORDFc.cached) cacheINPUT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + lpStruct->EventType = (*env)->GetShortField(env, lpObject, INPUT_RECORDFc.eventType); +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.keyEvent); + if (lpObject1 != NULL) getKEY_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.KeyEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.mouseEvent); + if (lpObject1 != NULL) getMOUSE_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.MouseEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.windowBufferSizeEvent); + if (lpObject1 != NULL) getWINDOW_BUFFER_SIZE_RECORDFields(env, lpObject1, &lpStruct->Event.WindowBufferSizeEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.menuEvent); + if (lpObject1 != NULL) getMENU_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.MenuEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.focusEvent); + if (lpObject1 != NULL) getFOCUS_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.FocusEvent); + } +#endif + return lpStruct; +} + +void setINPUT_RECORDFields(JNIEnv *env, jobject lpObject, INPUT_RECORD *lpStruct) +{ + if (!INPUT_RECORDFc.cached) cacheINPUT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, INPUT_RECORDFc.eventType, (jshort)lpStruct->EventType); +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.keyEvent); + if (lpObject1 != NULL) setKEY_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.KeyEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.mouseEvent); + if (lpObject1 != NULL) setMOUSE_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.MouseEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.windowBufferSizeEvent); + if (lpObject1 != NULL) setWINDOW_BUFFER_SIZE_RECORDFields(env, lpObject1, &lpStruct->Event.WindowBufferSizeEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.menuEvent); + if (lpObject1 != NULL) setMENU_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.MenuEvent); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, INPUT_RECORDFc.focusEvent); + if (lpObject1 != NULL) setFOCUS_EVENT_RECORDFields(env, lpObject1, &lpStruct->Event.FocusEvent); + } +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct KEY_EVENT_RECORD_FID_CACHE { + int cached; + jclass clazz; + jfieldID keyDown, repeatCount, keyCode, scanCode, uchar, controlKeyState; +} KEY_EVENT_RECORD_FID_CACHE; + +KEY_EVENT_RECORD_FID_CACHE KEY_EVENT_RECORDFc; + +void cacheKEY_EVENT_RECORDFields(JNIEnv *env, jobject lpObject) +{ + if (KEY_EVENT_RECORDFc.cached) return; + KEY_EVENT_RECORDFc.clazz = (*env)->GetObjectClass(env, lpObject); + KEY_EVENT_RECORDFc.keyDown = (*env)->GetFieldID(env, KEY_EVENT_RECORDFc.clazz, "keyDown", "Z"); + KEY_EVENT_RECORDFc.repeatCount = (*env)->GetFieldID(env, KEY_EVENT_RECORDFc.clazz, "repeatCount", "S"); + KEY_EVENT_RECORDFc.keyCode = (*env)->GetFieldID(env, KEY_EVENT_RECORDFc.clazz, "keyCode", "S"); + KEY_EVENT_RECORDFc.scanCode = (*env)->GetFieldID(env, KEY_EVENT_RECORDFc.clazz, "scanCode", "S"); + KEY_EVENT_RECORDFc.uchar = (*env)->GetFieldID(env, KEY_EVENT_RECORDFc.clazz, "uchar", "C"); + KEY_EVENT_RECORDFc.controlKeyState = (*env)->GetFieldID(env, KEY_EVENT_RECORDFc.clazz, "controlKeyState", "I"); + hawtjni_w_barrier(); + KEY_EVENT_RECORDFc.cached = 1; +} + +KEY_EVENT_RECORD *getKEY_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, KEY_EVENT_RECORD *lpStruct) +{ + if (!KEY_EVENT_RECORDFc.cached) cacheKEY_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + lpStruct->bKeyDown = (*env)->GetBooleanField(env, lpObject, KEY_EVENT_RECORDFc.keyDown); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->wRepeatCount = (*env)->GetShortField(env, lpObject, KEY_EVENT_RECORDFc.repeatCount); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->wVirtualKeyCode = (*env)->GetShortField(env, lpObject, KEY_EVENT_RECORDFc.keyCode); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->wVirtualScanCode = (*env)->GetShortField(env, lpObject, KEY_EVENT_RECORDFc.scanCode); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->uChar.UnicodeChar = (*env)->GetCharField(env, lpObject, KEY_EVENT_RECORDFc.uchar); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->dwControlKeyState = (*env)->GetIntField(env, lpObject, KEY_EVENT_RECORDFc.controlKeyState); +#endif + return lpStruct; +} + +void setKEY_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, KEY_EVENT_RECORD *lpStruct) +{ + if (!KEY_EVENT_RECORDFc.cached) cacheKEY_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetBooleanField(env, lpObject, KEY_EVENT_RECORDFc.keyDown, (jboolean)lpStruct->bKeyDown); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, KEY_EVENT_RECORDFc.repeatCount, (jshort)lpStruct->wRepeatCount); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, KEY_EVENT_RECORDFc.keyCode, (jshort)lpStruct->wVirtualKeyCode); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, KEY_EVENT_RECORDFc.scanCode, (jshort)lpStruct->wVirtualScanCode); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetCharField(env, lpObject, KEY_EVENT_RECORDFc.uchar, (jchar)lpStruct->uChar.UnicodeChar); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetIntField(env, lpObject, KEY_EVENT_RECORDFc.controlKeyState, (jint)lpStruct->dwControlKeyState); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct MENU_EVENT_RECORD_FID_CACHE { + int cached; + jclass clazz; + jfieldID commandId; +} MENU_EVENT_RECORD_FID_CACHE; + +MENU_EVENT_RECORD_FID_CACHE MENU_EVENT_RECORDFc; + +void cacheMENU_EVENT_RECORDFields(JNIEnv *env, jobject lpObject) +{ + if (MENU_EVENT_RECORDFc.cached) return; + MENU_EVENT_RECORDFc.clazz = (*env)->GetObjectClass(env, lpObject); + MENU_EVENT_RECORDFc.commandId = (*env)->GetFieldID(env, MENU_EVENT_RECORDFc.clazz, "commandId", "I"); + hawtjni_w_barrier(); + MENU_EVENT_RECORDFc.cached = 1; +} + +MENU_EVENT_RECORD *getMENU_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MENU_EVENT_RECORD *lpStruct) +{ + if (!MENU_EVENT_RECORDFc.cached) cacheMENU_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + lpStruct->dwCommandId = (*env)->GetIntField(env, lpObject, MENU_EVENT_RECORDFc.commandId); +#endif + return lpStruct; +} + +void setMENU_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MENU_EVENT_RECORD *lpStruct) +{ + if (!MENU_EVENT_RECORDFc.cached) cacheMENU_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetIntField(env, lpObject, MENU_EVENT_RECORDFc.commandId, (jint)lpStruct->dwCommandId); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct MOUSE_EVENT_RECORD_FID_CACHE { + int cached; + jclass clazz; + jfieldID mousePosition, buttonState, controlKeyState, eventFlags; +} MOUSE_EVENT_RECORD_FID_CACHE; + +MOUSE_EVENT_RECORD_FID_CACHE MOUSE_EVENT_RECORDFc; + +void cacheMOUSE_EVENT_RECORDFields(JNIEnv *env, jobject lpObject) +{ + if (MOUSE_EVENT_RECORDFc.cached) return; + MOUSE_EVENT_RECORDFc.clazz = (*env)->GetObjectClass(env, lpObject); + MOUSE_EVENT_RECORDFc.mousePosition = (*env)->GetFieldID(env, MOUSE_EVENT_RECORDFc.clazz, "mousePosition", "Lorg/fusesource/jansi/internal/Kernel32$COORD;"); + MOUSE_EVENT_RECORDFc.buttonState = (*env)->GetFieldID(env, MOUSE_EVENT_RECORDFc.clazz, "buttonState", "I"); + MOUSE_EVENT_RECORDFc.controlKeyState = (*env)->GetFieldID(env, MOUSE_EVENT_RECORDFc.clazz, "controlKeyState", "I"); + MOUSE_EVENT_RECORDFc.eventFlags = (*env)->GetFieldID(env, MOUSE_EVENT_RECORDFc.clazz, "eventFlags", "I"); + hawtjni_w_barrier(); + MOUSE_EVENT_RECORDFc.cached = 1; +} + +MOUSE_EVENT_RECORD *getMOUSE_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MOUSE_EVENT_RECORD *lpStruct) +{ + if (!MOUSE_EVENT_RECORDFc.cached) cacheMOUSE_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, MOUSE_EVENT_RECORDFc.mousePosition); + if (lpObject1 != NULL) getCOORDFields(env, lpObject1, &lpStruct->dwMousePosition); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->dwButtonState = (*env)->GetIntField(env, lpObject, MOUSE_EVENT_RECORDFc.buttonState); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->dwControlKeyState = (*env)->GetIntField(env, lpObject, MOUSE_EVENT_RECORDFc.controlKeyState); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->dwEventFlags = (*env)->GetIntField(env, lpObject, MOUSE_EVENT_RECORDFc.eventFlags); +#endif + return lpStruct; +} + +void setMOUSE_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MOUSE_EVENT_RECORD *lpStruct) +{ + if (!MOUSE_EVENT_RECORDFc.cached) cacheMOUSE_EVENT_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, MOUSE_EVENT_RECORDFc.mousePosition); + if (lpObject1 != NULL) setCOORDFields(env, lpObject1, &lpStruct->dwMousePosition); + } +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetIntField(env, lpObject, MOUSE_EVENT_RECORDFc.buttonState, (jint)lpStruct->dwButtonState); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetIntField(env, lpObject, MOUSE_EVENT_RECORDFc.controlKeyState, (jint)lpStruct->dwControlKeyState); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetIntField(env, lpObject, MOUSE_EVENT_RECORDFc.eventFlags, (jint)lpStruct->dwEventFlags); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct SMALL_RECT_FID_CACHE { + int cached; + jclass clazz; + jfieldID left, top, right, bottom; +} SMALL_RECT_FID_CACHE; + +SMALL_RECT_FID_CACHE SMALL_RECTFc; + +void cacheSMALL_RECTFields(JNIEnv *env, jobject lpObject) +{ + if (SMALL_RECTFc.cached) return; + SMALL_RECTFc.clazz = (*env)->GetObjectClass(env, lpObject); + SMALL_RECTFc.left = (*env)->GetFieldID(env, SMALL_RECTFc.clazz, "left", "S"); + SMALL_RECTFc.top = (*env)->GetFieldID(env, SMALL_RECTFc.clazz, "top", "S"); + SMALL_RECTFc.right = (*env)->GetFieldID(env, SMALL_RECTFc.clazz, "right", "S"); + SMALL_RECTFc.bottom = (*env)->GetFieldID(env, SMALL_RECTFc.clazz, "bottom", "S"); + hawtjni_w_barrier(); + SMALL_RECTFc.cached = 1; +} + +SMALL_RECT *getSMALL_RECTFields(JNIEnv *env, jobject lpObject, SMALL_RECT *lpStruct) +{ + if (!SMALL_RECTFc.cached) cacheSMALL_RECTFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + lpStruct->Left = (*env)->GetShortField(env, lpObject, SMALL_RECTFc.left); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->Top = (*env)->GetShortField(env, lpObject, SMALL_RECTFc.top); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->Right = (*env)->GetShortField(env, lpObject, SMALL_RECTFc.right); +#endif +#if defined(_WIN32) || defined(_WIN64) + lpStruct->Bottom = (*env)->GetShortField(env, lpObject, SMALL_RECTFc.bottom); +#endif + return lpStruct; +} + +void setSMALL_RECTFields(JNIEnv *env, jobject lpObject, SMALL_RECT *lpStruct) +{ + if (!SMALL_RECTFc.cached) cacheSMALL_RECTFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, SMALL_RECTFc.left, (jshort)lpStruct->Left); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, SMALL_RECTFc.top, (jshort)lpStruct->Top); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, SMALL_RECTFc.right, (jshort)lpStruct->Right); +#endif +#if defined(_WIN32) || defined(_WIN64) + (*env)->SetShortField(env, lpObject, SMALL_RECTFc.bottom, (jshort)lpStruct->Bottom); +#endif +} +#endif + +#if defined(_WIN32) || defined(_WIN64) +typedef struct WINDOW_BUFFER_SIZE_RECORD_FID_CACHE { + int cached; + jclass clazz; + jfieldID size; +} WINDOW_BUFFER_SIZE_RECORD_FID_CACHE; + +WINDOW_BUFFER_SIZE_RECORD_FID_CACHE WINDOW_BUFFER_SIZE_RECORDFc; + +void cacheWINDOW_BUFFER_SIZE_RECORDFields(JNIEnv *env, jobject lpObject) +{ + if (WINDOW_BUFFER_SIZE_RECORDFc.cached) return; + WINDOW_BUFFER_SIZE_RECORDFc.clazz = (*env)->GetObjectClass(env, lpObject); + WINDOW_BUFFER_SIZE_RECORDFc.size = (*env)->GetFieldID(env, WINDOW_BUFFER_SIZE_RECORDFc.clazz, "size", "Lorg/fusesource/jansi/internal/Kernel32$COORD;"); + hawtjni_w_barrier(); + WINDOW_BUFFER_SIZE_RECORDFc.cached = 1; +} + +WINDOW_BUFFER_SIZE_RECORD *getWINDOW_BUFFER_SIZE_RECORDFields(JNIEnv *env, jobject lpObject, WINDOW_BUFFER_SIZE_RECORD *lpStruct) +{ + if (!WINDOW_BUFFER_SIZE_RECORDFc.cached) cacheWINDOW_BUFFER_SIZE_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, WINDOW_BUFFER_SIZE_RECORDFc.size); + if (lpObject1 != NULL) getCOORDFields(env, lpObject1, &lpStruct->dwSize); + } +#endif + return lpStruct; +} + +void setWINDOW_BUFFER_SIZE_RECORDFields(JNIEnv *env, jobject lpObject, WINDOW_BUFFER_SIZE_RECORD *lpStruct) +{ + if (!WINDOW_BUFFER_SIZE_RECORDFc.cached) cacheWINDOW_BUFFER_SIZE_RECORDFields(env, lpObject); +#if defined(_WIN32) || defined(_WIN64) + { + jobject lpObject1 = (*env)->GetObjectField(env, lpObject, WINDOW_BUFFER_SIZE_RECORDFc.size); + if (lpObject1 != NULL) setCOORDFields(env, lpObject1, &lpStruct->dwSize); + } +#endif +} +#endif + diff --git a/jansi/src/main/native/jansi_structs.h b/jansi/src/main/native/jansi_structs.h new file mode 100644 index 00000000..e1c8d30b --- /dev/null +++ b/jansi/src/main/native/jansi_structs.h @@ -0,0 +1,137 @@ +/******************************************************************************* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +#include "jansi.h" + +#if defined(HAVE_IOCTL) +void cacheTermiosFields(JNIEnv *env, jobject lpObject); +struct termios *getTermiosFields(JNIEnv *env, jobject lpObject, struct termios *lpStruct); +void setTermiosFields(JNIEnv *env, jobject lpObject, struct termios *lpStruct); +#else +#define cacheTermiosFields(a,b) +#define getTermiosFields(a,b,c) NULL +#define setTermiosFields(a,b,c) +#endif + +#if defined(HAVE_IOCTL) +void cacheWinSizeFields(JNIEnv *env, jobject lpObject); +struct winsize *getWinSizeFields(JNIEnv *env, jobject lpObject, struct winsize *lpStruct); +void setWinSizeFields(JNIEnv *env, jobject lpObject, struct winsize *lpStruct); +#else +#define cacheWinSizeFields(a,b) +#define getWinSizeFields(a,b,c) NULL +#define setWinSizeFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheCHAR_INFOFields(JNIEnv *env, jobject lpObject); +CHAR_INFO *getCHAR_INFOFields(JNIEnv *env, jobject lpObject, CHAR_INFO *lpStruct); +void setCHAR_INFOFields(JNIEnv *env, jobject lpObject, CHAR_INFO *lpStruct); +#else +#define cacheCHAR_INFOFields(a,b) +#define getCHAR_INFOFields(a,b,c) NULL +#define setCHAR_INFOFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheCONSOLE_SCREEN_BUFFER_INFOFields(JNIEnv *env, jobject lpObject); +CONSOLE_SCREEN_BUFFER_INFO *getCONSOLE_SCREEN_BUFFER_INFOFields(JNIEnv *env, jobject lpObject, CONSOLE_SCREEN_BUFFER_INFO *lpStruct); +void setCONSOLE_SCREEN_BUFFER_INFOFields(JNIEnv *env, jobject lpObject, CONSOLE_SCREEN_BUFFER_INFO *lpStruct); +#else +#define cacheCONSOLE_SCREEN_BUFFER_INFOFields(a,b) +#define getCONSOLE_SCREEN_BUFFER_INFOFields(a,b,c) NULL +#define setCONSOLE_SCREEN_BUFFER_INFOFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheCOORDFields(JNIEnv *env, jobject lpObject); +COORD *getCOORDFields(JNIEnv *env, jobject lpObject, COORD *lpStruct); +void setCOORDFields(JNIEnv *env, jobject lpObject, COORD *lpStruct); +#else +#define cacheCOORDFields(a,b) +#define getCOORDFields(a,b,c) NULL +#define setCOORDFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheFOCUS_EVENT_RECORDFields(JNIEnv *env, jobject lpObject); +FOCUS_EVENT_RECORD *getFOCUS_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, FOCUS_EVENT_RECORD *lpStruct); +void setFOCUS_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, FOCUS_EVENT_RECORD *lpStruct); +#else +#define cacheFOCUS_EVENT_RECORDFields(a,b) +#define getFOCUS_EVENT_RECORDFields(a,b,c) NULL +#define setFOCUS_EVENT_RECORDFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheINPUT_RECORDFields(JNIEnv *env, jobject lpObject); +INPUT_RECORD *getINPUT_RECORDFields(JNIEnv *env, jobject lpObject, INPUT_RECORD *lpStruct); +void setINPUT_RECORDFields(JNIEnv *env, jobject lpObject, INPUT_RECORD *lpStruct); +#else +#define cacheINPUT_RECORDFields(a,b) +#define getINPUT_RECORDFields(a,b,c) NULL +#define setINPUT_RECORDFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheKEY_EVENT_RECORDFields(JNIEnv *env, jobject lpObject); +KEY_EVENT_RECORD *getKEY_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, KEY_EVENT_RECORD *lpStruct); +void setKEY_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, KEY_EVENT_RECORD *lpStruct); +#else +#define cacheKEY_EVENT_RECORDFields(a,b) +#define getKEY_EVENT_RECORDFields(a,b,c) NULL +#define setKEY_EVENT_RECORDFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheMENU_EVENT_RECORDFields(JNIEnv *env, jobject lpObject); +MENU_EVENT_RECORD *getMENU_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MENU_EVENT_RECORD *lpStruct); +void setMENU_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MENU_EVENT_RECORD *lpStruct); +#else +#define cacheMENU_EVENT_RECORDFields(a,b) +#define getMENU_EVENT_RECORDFields(a,b,c) NULL +#define setMENU_EVENT_RECORDFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheMOUSE_EVENT_RECORDFields(JNIEnv *env, jobject lpObject); +MOUSE_EVENT_RECORD *getMOUSE_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MOUSE_EVENT_RECORD *lpStruct); +void setMOUSE_EVENT_RECORDFields(JNIEnv *env, jobject lpObject, MOUSE_EVENT_RECORD *lpStruct); +#else +#define cacheMOUSE_EVENT_RECORDFields(a,b) +#define getMOUSE_EVENT_RECORDFields(a,b,c) NULL +#define setMOUSE_EVENT_RECORDFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheSMALL_RECTFields(JNIEnv *env, jobject lpObject); +SMALL_RECT *getSMALL_RECTFields(JNIEnv *env, jobject lpObject, SMALL_RECT *lpStruct); +void setSMALL_RECTFields(JNIEnv *env, jobject lpObject, SMALL_RECT *lpStruct); +#else +#define cacheSMALL_RECTFields(a,b) +#define getSMALL_RECTFields(a,b,c) NULL +#define setSMALL_RECTFields(a,b,c) +#endif + +#if defined(_WIN32) || defined(_WIN64) +void cacheWINDOW_BUFFER_SIZE_RECORDFields(JNIEnv *env, jobject lpObject); +WINDOW_BUFFER_SIZE_RECORD *getWINDOW_BUFFER_SIZE_RECORDFields(JNIEnv *env, jobject lpObject, WINDOW_BUFFER_SIZE_RECORD *lpStruct); +void setWINDOW_BUFFER_SIZE_RECORDFields(JNIEnv *env, jobject lpObject, WINDOW_BUFFER_SIZE_RECORD *lpStruct); +#else +#define cacheWINDOW_BUFFER_SIZE_RECORDFields(a,b) +#define getWINDOW_BUFFER_SIZE_RECORDFields(a,b,c) NULL +#define setWINDOW_BUFFER_SIZE_RECORDFields(a,b,c) +#endif + diff --git a/jansi/src/main/native/jansi_ttyname.c b/jansi/src/main/native/jansi_ttyname.c new file mode 100644 index 00000000..995b3799 --- /dev/null +++ b/jansi/src/main/native/jansi_ttyname.c @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (C) 2017, the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +#include "jansi.h" +#include "hawtjni.h" +#include "jansi_structs.h" + +#define CLibrary_NATIVE(func) Java_org_fusesource_jansi_internal_CLibrary_##func + +#if defined(HAVE_TTYNAME) +JNIEXPORT jstring JNICALL CLibrary_NATIVE(ttyname) + (JNIEnv *env, jclass that, jint arg0) +{ + jstring rc = 0; + char s[256] = { 0 }; + int r = 0; + + r = ttyname_r(arg0, s, 256); + if (!r) rc = (*env)->NewStringUTF(env,s); + + return rc; +} +#endif diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/FreeBSD/x86/libjansi.so b/jansi/src/main/resources/org/fusesource/jansi/internal/native/FreeBSD/x86/libjansi.so new file mode 100755 index 0000000000000000000000000000000000000000..74ca5b52c83b52ddecaef0bf8dd287312fd3cff8 GIT binary patch literal 4128 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 literal 0 HcmV?d00001 diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/arm/libjansi.so b/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/arm/libjansi.so new file mode 100755 index 0000000000000000000000000000000000000000..f5711cd6c175ad8fa1ac8f7f94e705cbcbc02e4d GIT binary patch literal 4400 zcmb_fe{54#6uz(Bu)rK;3>h%7$f6^R(#>k7*&iES#|B%cYv;fpdA@Fs@vv+0wL@l% zM!|@QFi|4Wm<<1tC`J<#gQ7%Yq7jKvL4rU2D9pww8qlbjKkN6s*Q<|#iA+xOy>rez z-#z!f`_8+)@BVOmi=rq(id$3*dcmmx^oC1?aJfWrQ20bKVijVJ6_?t%`WPXI9@3!h-TsDPu;5>>DX8M`T$>4STYu)h}|uN-g#Dn~m*KIQq^Efc|5&O3GY!ynyRUc0CJ|sl7Pi%8-ak)#1 zJQjBv_?Wi9l86}qbCdxbi*gxI0n7#F0rP>&0m=eiUJ8zdmy||M9XVaPG1jp2wQb** z9=~gK=_?5jJQ|EM|eSIo~qOw_!qjHR9jmA;^5|VK~Q&Pw=k>f6T#OjKUjt_$ka|FZ_TtpXp*1 z=Ie3H_u8|@pC!ISz8@X^zec|=9sUdOvkw0$@Xt8>eNGntNXr28Ue>g z_WV;d(Y9MKH|JwZ81Y_zI_1AksCu84(Xe&I(`kF>aN68OtcafMv+RO~5-Zx{EwiN8wO7vB84^z&k=K=s|&gw{~PqHpl4$rtfmIH zh8hQv05uK-LF!9{sD!=@JRddUp2nqLmk4pn)A;7tg8Z@*McJjfqU=bnG&`L2oH>vi zcVY8>XZWP|(4!~Ee|RG&?K7~;10%U|-$>3K7|yzUPkbdr*C=u*Kjrh^97exN%qs{^ zP}m$HhO_R#=9BKg9oZ=&I_g7=ebHw}1@gE8%n`M6%)(rbBFBfoV*t++_1=+OJ#s1D z;Vg40-aE2QGk2eO_KF9xRmgSF`|^oGKIMG*wj$3Kpb@A-KHht4VGbg2B*(EE3O@c` z<^>&dstJr>c}M2#&*$gAm(QP4e7i?0WnbUhIk|rI$o)Ickvt2P6zm4fnPYLzBJh|s z4)R&|j@6yVzVBkqDjnnflFv_@k==cQ>+myTZ=o)BBCij5Id;Y0V{guRr7bq+JQ$15 zaSOQj0xtBUKN)b&^1d*vxDAW)qkVirR$R#^-5 zfBG|@8iz*diNmNvo>dPc8B&WO5Rk&EeT0M;HOhC%Ixj) zT=8cQTdSK)bFiU;>hoKN`vtq6r~@KrbKaYIY`g8u9MbxUgl zi*2hAJg2#739@Or7B_^l5N2^OCZ@PN%2Z{VtE{M8nXSxmS15Cpd9L|x;ZLtiXUvQi z7ye`_qx<`lgZ}uSk?31$^a;ybr=`~kf8S6tJv3nJjA=(U>So$VCC_qH#7sRwzHMws zWQ5;3koYtDCfL@A$*-?d*P7aZZpT#3G_@f+ChhgTNQE@ofYFN~Qs`=Jqkin7!rz-3 z7|@ewYwGIoYnhB`#0N7tFTbs>xK12kSm`#c|yCivQVKYD9Gk#ML3MrDe2@T}&etqB&GDfbnAB0^B@cy{J@Vi>Z z(Db*x9X7v7$>Y9L{V%+y5$Cw%@msLwUw9*kbM45pztin+bU8LPmQ?HkWIpa&UfgUo z+N6+2ya-4h_l|n-WG-^0{R(X6<+%JdYyj_k>$eYa=3~85$P3!0b!Ch=2q4!6s}YwC X;MGV6nj8u>$CUC6cppgzTJrt^9@&s} literal 0 HcmV?d00001 diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/arm64/libjansi.so b/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/arm64/libjansi.so new file mode 100755 index 0000000000000000000000000000000000000000..abc747d839164888ef2769570663f54e47f06366 GIT binary patch literal 5672 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 F{SPIWFLM9@ literal 0 HcmV?d00001 diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/ppc64/libjansi.so b/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/ppc64/libjansi.so new file mode 100755 index 0000000000000000000000000000000000000000..96e3f698878435607bfe94be788e58861e5f5ce9 GIT binary patch literal 6376 zcmeHLeQX@n5ufup$(gw3a1A(sqVe?``j2RvA1`(u@}yF z>D?wckzG#4l$wu^2;0~4^kkcq~wgFCgEx&u2$MJUzBc``^X7W zxh!K+@8*rR6##RxC%Wy7nX&T}%`g1t?hw8Pix-7?e%x>?*8A-t={9Ew~uu+{^866FW!IR%|F_X zKj+U26;P7v$7$xpto=OCQb9Q@P9s^5A+KLUPSdBXA^+iL$Xh={{v=LJHIC|UXh4y8 z-iTKxw}M};TU&{L!x*?aSpko_`qhaO?Z+7iR#RrHMC*(EH@f`y+V(Y&blKl1?Q2~2 z&A2egPr@b7W2oxn74U4Oh}kAX_sf1g?y~=`9k=?TJU@_eyIuBY$v?&|cgcS*<^Pg# zdEAalKW#4i(=wmuT=K)x&pR$Zf0q39MlB&!vRdJ*=- z`_#c)EU#r?k9JT~^M!GB-vQL*4;0e6dY6_f8mf`QnCL`}#EeuyD;z?JVO|m-7!0fD|=j(Ee(8xe27PCh=vBBxu+ZXR1+`GDJM*8l++?>;vHB#w7F(3FIsCq^-HGFlX zibe6}Kv6COyJLOfh}s%x`M!M1iv5}zo=f=cu;0PL#ZyO~#A8Jn44}*=xi8XwNYo|Y zi$0h96deMPmaoDWE)v^w+b8#x@1V|kF7rF&_{v1i@Kzo z&LK|wUWeS7567v6&~k5S_UwXpenu%T#mgYpx&MK1`$Cy-+7F)Pr>(kWv`zX-WlI3Z zcU8jq&_6A!A8|`bsB1@?r3J5VT7goWeL6Y$?{fL~qkr;AWlO2P14^m(q27j>DtKmx z0>6rp++V84E%2FL3LG1tT&DVW&MbJFXDFw)Fema`hxt+-%Efuuz5&8`e2sM;|H*1R zD9yIp@s#_f&Fyp3X4TyE6P`KDe|CW4)|SE;_rz-4kr>A9TW4GmFDT;;mFnjK=E+x# z`au2_*)Q%#4IB$uR;qLP-t^LI=f$|5K~8=0fYM=)1&%TLI_enb3;K8R{&2fx)!*v> zadXF1f5QwwgFSZWyUT}jMLt9c+q_BU@Q!sXbSY!|SImpXa|q*cZi!O;5%N7&N-cXJ z*;xkZq}u9x1Wun96}YL%I?h}s(wRX%?R*5!}|(H6*CGzdlr%0j#lnJ^0>WnPvZL~ z$o=Yi0kiL~RHb_;5$|WTPKfw^{_pb^U1^{s1M^;STE^$SrXBAAM0^b!lX|%=+IL^l z^B%|dG6{nqDUo;$^PWfdW};qp46vWtOR}Tr&u){9h;cuy5N+q2 z|0bjYm%QCy9_Mqi9hCY{Wt;mUyj;G2J}4Hb0-J*yEw*7j#j2-w%DfT>Sm-M;Sy^a*ueL7UWtPSpwp?U2xM{jM}RLqFQ2 zk;V$0{{rKAbbx0-2&D6qlX}iv-`ISf6|GNNGrSJz`v4L1M$ugPm&Lv^ z2#Mbl%=x`Sc={ga#!sM(^5XYcNxo;8(>~}V#o54m4vQ1NDDljLoVdg(k~5ipWnaB@*^(W+fMM$ z-G0`E2YIi;k90N#1zY)NJo7YasLuKGz8I8vWd$iJjAQ;M6g%-lGCt$EpX`Ql+ng`7!o1{{eEtci{j4 literal 0 HcmV?d00001 diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/x86/libjansi.so b/jansi/src/main/resources/org/fusesource/jansi/internal/native/Linux/x86/libjansi.so new file mode 100755 index 0000000000000000000000000000000000000000..95a7e974f9c1e9e49f76869215cb6c2d3008852f GIT binary patch literal 5368 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 literal 0 HcmV?d00001 diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/Mac/x86/libjansi.jnilib b/jansi/src/main/resources/org/fusesource/jansi/internal/native/Mac/x86/libjansi.jnilib new file mode 100755 index 0000000000000000000000000000000000000000..933d3ccc3779a6c0412f6a6acd18655406b0f9c3 GIT binary patch literal 9408 zcmeHN-%Aux6dp}$F-wUa1S2FgDA0AyLLwqvN8DUz%-u~3;xg`zGO{}pvtzjhu@HeJ zl|+ya`A`oL^b$RY1cl&3Z}lD(`w~Py{(&B<@66u8Su2QjpW=VJwwPr`G-d6d$11$nm$a88g!?o6AgCX?EVRf2$#YSQ?MCKL@RW*HDM%XkPF4 zdDQb9r2RS8BPb?mWipoO**4Cl5wY%E;NZ_e+~4}`I3L>ZF%Bi>$U!Tz90a7{e= z<948b0@Ad>?r8Ru?gUNEF)rxs!&b@WU}UkA1jO@h9s(wJtHTN*Q!OtNf8$P1D7 zBZkHev`Er!=mWe@JcuS35DW+g1OtKr!GK^uFd!HZ3{;+ht6u{nr#?~M@%g#WP}ifa z_49KdiYRbqd~I@pzs|40__L6>{*fDo1F!NgVWV@&e14fi0xQ+%o?C-c1s)3v3zT~g zgqmNwXC@qm=*&T~Oa~)0!gR*3M;VQ7Wn@KbEZh!2cDo0iqDedj1A+m;fM7r{AQ%t~ z2nGZLf&syRU_dY+82G;!px=&hmr%2~w{>S*t-ndq8(bJ1!*u&(t(Jb~ZGhuR+$Ydg z0bvJN>qYE)*SSa?*H6&C7C3=GJdPO6Ufms`<*8cxJmNIoqqaTXet!<)zzQAQG* zPBJ8)sZcq?vXZD&Dm4+qs#S!g*l=$&>QWsqchSZoO20a`zI$Skv#74@#dALgTT9tT QgTcc`LfwbEyYOxQ0<2vn2LJ#7 literal 0 HcmV?d00001 diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/Mac/x86_64/libjansi.jnilib b/jansi/src/main/resources/org/fusesource/jansi/internal/native/Mac/x86_64/libjansi.jnilib new file mode 100755 index 0000000000000000000000000000000000000000..69b5cdd3811e8befdc55c955a21067d99b03c617 GIT binary patch literal 5856 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 R?2-T3#W;?M`~RVT{|_WuAiw|s literal 0 HcmV?d00001 diff --git a/jansi/src/main/resources/org/fusesource/jansi/internal/native/Windows/x86_64/jansi.dll b/jansi/src/main/resources/org/fusesource/jansi/internal/native/Windows/x86_64/jansi.dll new file mode 100755 index 0000000000000000000000000000000000000000..818829ca6ecdbeb4668bac6d04d7ad8362a344c9 GIT binary patch literal 33280 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 zm7D7}maven-resources-plugin 3.1.0 - - - src/main/resources - true - -