From d03c143f9441bd7e1fae23cb7a987e48facc6aff Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 27 Apr 2021 14:05:34 +0200 Subject: [PATCH] Provide a native library, fixes #400 --- daemon/pom.xml | 4 + .../org/apache/maven/cli/DaemonMavenCli.java | 2 +- native/Makefile | 98 + native/Makefile.common | 166 ++ native/docker/dockcross-linux-x86 | 273 +++ native/docker/dockcross-windows-static-x64 | 273 +++ native/docker/dockcross-windows-static-x86 | 273 +++ native/pom.xml | 141 ++ .../org/mvndaemon/mvnd/nativ/CLibrary.java | 39 + .../mvnd/nativ/MvndNativeLoader.java | 393 ++++ .../java/org/mvndaemon/mvnd/nativ/OSInfo.java | 213 ++ native/src/main/native/inc_linux/jni.h | 1959 ++++++++++++++++ native/src/main/native/inc_linux/jni_md.h | 24 + native/src/main/native/inc_mac/jni.h | 1961 +++++++++++++++++ native/src/main/native/inc_mac/jni_md.h | 23 + native/src/main/native/inc_win/jni.h | 1951 ++++++++++++++++ native/src/main/native/inc_win/jni_md.h | 19 + native/src/main/native/mvndnative.c | 138 ++ native/src/main/native/mvndnative.h | 160 ++ .../mvndnative/resource-config.json | 5 + .../mvnd/nativ/FreeBSD/x86/libmvndnative.so | Bin 0 -> 5019 bytes .../nativ/FreeBSD/x86_64/libmvndnative.so | Bin 0 -> 6995 bytes .../mvnd/nativ/Linux/arm/libmvndnative.so | Bin 0 -> 6000 bytes .../mvnd/nativ/Linux/arm64/libmvndnative.so | Bin 0 -> 7904 bytes .../mvnd/nativ/Linux/armv7/libmvndnative.so | Bin 0 -> 5736 bytes .../mvnd/nativ/Linux/ppc64/libmvndnative.so | Bin 0 -> 8240 bytes .../mvnd/nativ/Linux/x86/libmvndnative.so | Bin 0 -> 7240 bytes .../mvnd/nativ/Linux/x86_64/libmvndnative.so | Bin 0 -> 7416 bytes .../mvnd/nativ/Mac/x86/libmvndnative.jnilib | Bin 0 -> 9044 bytes .../nativ/Mac/x86_64/libmvndnative.jnilib | Bin 0 -> 9260 bytes .../mvnd/nativ/Windows/x86/mvndnative.dll | Bin 0 -> 85217 bytes .../mvnd/nativ/Windows/x86_64/mvndnative.dll | Bin 0 -> 99503 bytes .../mvnd/nativ/mvndnative.properties | 17 + .../mvndaemon/mvnd/nativ/CLibraryTest.java | 49 + .../mvnd/nativ/MvndNativeLoaderTest.java | 26 + pom.xml | 11 + 36 files changed, 8217 insertions(+), 1 deletion(-) create mode 100644 native/Makefile create mode 100644 native/Makefile.common create mode 100755 native/docker/dockcross-linux-x86 create mode 100755 native/docker/dockcross-windows-static-x64 create mode 100755 native/docker/dockcross-windows-static-x86 create mode 100644 native/pom.xml create mode 100644 native/src/main/java/org/mvndaemon/mvnd/nativ/CLibrary.java create mode 100644 native/src/main/java/org/mvndaemon/mvnd/nativ/MvndNativeLoader.java create mode 100644 native/src/main/java/org/mvndaemon/mvnd/nativ/OSInfo.java create mode 100644 native/src/main/native/inc_linux/jni.h create mode 100644 native/src/main/native/inc_linux/jni_md.h create mode 100644 native/src/main/native/inc_mac/jni.h create mode 100644 native/src/main/native/inc_mac/jni_md.h create mode 100644 native/src/main/native/inc_win/jni.h create mode 100644 native/src/main/native/inc_win/jni_md.h create mode 100644 native/src/main/native/mvndnative.c create mode 100644 native/src/main/native/mvndnative.h create mode 100644 native/src/main/resources/META-INF/native-image/mvndnative/resource-config.json create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86_64/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm64/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/armv7/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/ppc64/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86_64/libmvndnative.so create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Mac/x86/libmvndnative.jnilib create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Mac/x86_64/libmvndnative.jnilib create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Windows/x86/mvndnative.dll create mode 100755 native/src/main/resources/org/mvndaemon/mvnd/nativ/Windows/x86_64/mvndnative.dll create mode 100644 native/src/main/resources/org/mvndaemon/mvnd/nativ/mvndnative.properties create mode 100644 native/src/test/java/org/mvndaemon/mvnd/nativ/CLibraryTest.java create mode 100644 native/src/test/java/org/mvndaemon/mvnd/nativ/MvndNativeLoaderTest.java diff --git a/daemon/pom.xml b/daemon/pom.xml index e681dcb45..628b03a5e 100644 --- a/daemon/pom.xml +++ b/daemon/pom.xml @@ -41,6 +41,10 @@ + + org.mvndaemon.mvnd + mvnd-native + org.apache.maven maven-embedder diff --git a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java index dbd70d9de..f52e53646 100644 --- a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java +++ b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java @@ -95,7 +95,6 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.util.StringUtils; import org.eclipse.aether.transfer.TransferListener; -import org.fusesource.jansi.internal.CLibrary; import org.mvndaemon.mvnd.cache.invalidating.InvalidatingExtensionRealmCache; import org.mvndaemon.mvnd.cache.invalidating.InvalidatingPluginArtifactsCache; import org.mvndaemon.mvnd.cache.invalidating.InvalidatingPluginRealmCache; @@ -105,6 +104,7 @@ import org.mvndaemon.mvnd.logging.smart.BuildEventListener; import org.mvndaemon.mvnd.logging.smart.LoggingExecutionListener; import org.mvndaemon.mvnd.logging.smart.LoggingOutputStream; +import org.mvndaemon.mvnd.nativ.CLibrary; import org.mvndaemon.mvnd.plugin.CliMavenPluginManager; import org.mvndaemon.mvnd.transfer.DaemonMavenTransferListener; import org.slf4j.ILoggerFactory; diff --git a/native/Makefile b/native/Makefile new file mode 100644 index 000000000..571f2be0b --- /dev/null +++ b/native/Makefile @@ -0,0 +1,98 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 Makefile.common + +.phony: all package native native-all deploy + +all: package + +MVNDNATIVE_OUT:=target/native-$(OS_NAME)-$(OS_ARCH) + +CCFLAGS:= -I$(MVNDNATIVE_OUT) $(CCFLAGS) + + +clean-native: + rm -rf $(MVNDNATIVE_OUT) + +$(MVNDNATIVE_OUT)/%.o: src/main/native/%.c + @mkdir -p $(@D) + $(info running: $(CC) $(CCFLAGS) -c $< -o $@) + $(CC) $(CCFLAGS) -c $< -o $@ + +$(MVNDNATIVE_OUT)/$(LIBNAME): $(MVNDNATIVE_OUT)/mvndnative.o + @mkdir -p $(@D) + $(CC) $(CCFLAGS) -o $@ $(MVNDNATIVE_OUT)/mvndnative.o $(LINKFLAGS) + +NATIVE_DIR=src/main/resources/org/mvndaemon/mvnd/nativ/$(OS_NAME)/$(OS_ARCH) +NATIVE_TARGET_DIR:=target/classes/org/mvndaemon/mvnd/nativ/$(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): $(MVNDNATIVE_OUT)/$(LIBNAME) + @mkdir -p $(@D) + cp $< $@ + @mkdir -p $(NATIVE_TARGET_DIR) + cp $< $(NATIVE_TARGET_DIR)/$(LIBNAME) + +linux-x86: + ./docker/dockcross-linux-x86 bash -c 'make clean-native native OS_NAME=Linux OS_ARCH=x86' + +linux-x86_64: + docker run -it --rm -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: + docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=arm-linux-gnueabi multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=arm + +linux-armv7: + docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=arm-linux-gnueabihf multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=armv7 + +linux-arm64: + docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=aarch64-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=arm64 + +linux-ppc64: + docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=powerpc64le-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=ppc64 + +win-x86: + ./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: + ./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: + docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=i386-apple-darwin multiarch/crossbuild make clean-native native OS_NAME=Mac OS_ARCH=x86 + +mac-x86_64: + docker run -it --rm -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: + docker run -it --rm -v $$PWD:/workdir empterdose/freebsd-cross-build:9.3 make clean-native native CROSS_PREFIX=i386-freebsd9- OS_NAME=FreeBSD OS_ARCH=x86 + +freebsd-x86_64: + docker run -it --rm -v $$PWD:/workdir empterdose/freebsd-cross-build:9.3 make clean-native native CROSS_PREFIX=x86_64-freebsd9- OS_NAME=FreeBSD OS_ARCH=x86_64 + +#sparcv9: +# $(MAKE) native OS_NAME=SunOS OS_ARCH=sparcv9 + + + diff --git a/native/Makefile.common b/native/Makefile.common new file mode 100644 index 000000000..fdc3ea679 --- /dev/null +++ b/native/Makefile.common @@ -0,0 +1,166 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# 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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := libmvndnative.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 := mvndnative.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 := mvndnative.dll +Windows-x86_64_JANSI_FLAGS := + + +CC := $($(target)_CC) +STRIP := $($(target)_STRIP) +CCFLAGS := $($(target)_CCFLAGS) +LINKFLAGS := $($(target)_LINKFLAGS) +LIBNAME := $($(target)_LIBNAME) +CCFLAGS := $(CCFLAGS) diff --git a/native/docker/dockcross-linux-x86 b/native/docker/dockcross-linux-x86 new file mode 100755 index 000000000..0591e9107 --- /dev/null +++ b/native/docker/dockcross-linux-x86 @@ -0,0 +1,273 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +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/native/docker/dockcross-windows-static-x64 b/native/docker/dockcross-windows-static-x64 new file mode 100755 index 000000000..1cdb423ca --- /dev/null +++ b/native/docker/dockcross-windows-static-x64 @@ -0,0 +1,273 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +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/native/docker/dockcross-windows-static-x86 b/native/docker/dockcross-windows-static-x86 new file mode 100755 index 000000000..72c19c841 --- /dev/null +++ b/native/docker/dockcross-windows-static-x86 @@ -0,0 +1,273 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +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/native/pom.xml b/native/pom.xml new file mode 100644 index 000000000..17fe189ec --- /dev/null +++ b/native/pom.xml @@ -0,0 +1,141 @@ + + + + + 4.0.0 + + org.mvndaemon.mvnd + mvnd + 0.5.0-SNAPSHOT + + + mvnd-native + + jar + Maven Daemon - Native Library + + + + + src/main/resources + true + + **/*.properties + + + + src/main/resources + false + + **/*.properties + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + ${jdkTarget} + ${jdkTarget} + + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + + generate-graalvm-info + process-classes + + java + + + true + test + + info.picocli + picocli-codegen + + picocli.codegen.aot.graalvm.JniConfigGenerator + + org.mvndaemon.mvnd.nativ.CLibrary + -o=target/classes/META-INF/native-image/mvndnative/jni-config.json + + + + + + + info.picocli + picocli-codegen + 4.5.2 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + true + 1 + true + + + + + + + + org.junit.jupiter + junit-jupiter + 5.7.0 + test + + + org.junit.jupiter + junit-jupiter-params + 5.7.0 + test + + + info.picocli + picocli-codegen + 4.5.2 + test + + + + + + jdk15+ + + [15,) + + + 1.7 + 7 + + + + + diff --git a/native/src/main/java/org/mvndaemon/mvnd/nativ/CLibrary.java b/native/src/main/java/org/mvndaemon/mvnd/nativ/CLibrary.java new file mode 100644 index 000000000..6ac1b8032 --- /dev/null +++ b/native/src/main/java/org/mvndaemon/mvnd/nativ/CLibrary.java @@ -0,0 +1,39 @@ +/* + * 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.mvndaemon.mvnd.nativ; + +/** + * Interface to access some low level POSIX functions, loaded by + * HawtJNI Runtime + * as jansi library. + * + * @author Hiram Chirino + * @see MvndNativeLoader + */ +@SuppressWarnings("unused") +public class CLibrary { + + static { + MvndNativeLoader.initialize(); + } + + public static native int setenv(String name, String value); + + public static native int chdir(String path); + + public static native int getOsxMemoryInfo(long[] totalAndAvailMem); + +} diff --git a/native/src/main/java/org/mvndaemon/mvnd/nativ/MvndNativeLoader.java b/native/src/main/java/org/mvndaemon/mvnd/nativ/MvndNativeLoader.java new file mode 100644 index 000000000..b3682cc3c --- /dev/null +++ b/native/src/main/java/org/mvndaemon/mvnd/nativ/MvndNativeLoader.java @@ -0,0 +1,393 @@ +/*-------------------------------------------------------------------------- + * 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.mvndaemon.mvnd.nativ; + +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.Random; + +/** + * Set the system properties, library.mvndnative.path, library.mvndnative.name, + * appropriately so that mvndnative 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 mvndnative. + */ +public class MvndNativeLoader { + + private static boolean extracted = false; + private static String nativeLibraryPath; + private static String nativeLibrarySourceUrl; + + /** + * Loads mvndnative native library. + * + * @return True if mvndnative native library is successfully loaded; false + * otherwise. + */ + public static synchronized boolean initialize() { + // only cleanup before the first extract + if (!extracted) { + cleanup(); + } + try { + loadmvndnativeNativeLibrary(); + } catch (Exception e) { + throw new RuntimeException("Unable to load mvndnative 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("mvndnative.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 = "mvndnative-" + 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 int readNBytes(InputStream in, byte[] b) throws IOException { + int n = 0; + int len = b.length; + while (n < len) { + int count = in.read(b, n, len - n); + if (count <= 0) + break; + n += count; + } + return n; + } + + private static String contentsEquals(InputStream in1, InputStream in2) throws IOException { + byte[] buffer1 = new byte[8192]; + byte[] buffer2 = new byte[8192]; + int numRead1; + int numRead2; + while (true) { + numRead1 = readNBytes(in1, buffer1); + numRead2 = readNBytes(in2, buffer2); + if (numRead1 > 0) { + if (numRead2 <= 0) { + return "EOF on second stream but not first"; + } + if (numRead2 != numRead1) { + return "Read size different (" + numRead1 + " vs " + numRead2 + ")"; + } + // Otherwise same number of bytes read + if (!Arrays.equals(buffer1, buffer2)) { + return "Content differs"; + } + // Otherwise same bytes read, so continue ... + } else { + // Nothing more in stream 1 ... + if (numRead2 > 0) { + return "EOF on first stream but not second"; + } else { + return null; + } + } + } + } + + /** + * 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 = randomUUID(); + String extractedLibFileName = String.format("mvndnative-%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 = MvndNativeLoader.class.getResourceAsStream(nativeLibraryFilePath); + try { + if (!extractedLckFile.exists()) { + new FileOutputStream(extractedLckFile).close(); + } + OutputStream out = 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 = MvndNativeLoader.class.getResourceAsStream(nativeLibraryFilePath); + try { + InputStream extractedLibIn = new FileInputStream(extractedLibFile); + try { + String eq = contentsEquals(nativeIn, extractedLibIn); + if (eq != null) { + throw new RuntimeException( + String.format("Failed to write a native library file at %s because %s", extractedLibFile, eq)); + } + } finally { + extractedLibIn.close(); + } + } finally { + nativeIn.close(); + } + + // Load library + if (loadNativeLibrary(extractedLibFile)) { + nativeLibrarySourceUrl = MvndNativeLoader.class.getResource(nativeLibraryFilePath).toExternalForm(); + return true; + } + } catch (IOException e) { + System.err.println(e.getMessage()); + } + return false; + } + + private static String randomUUID() { + return Long.toHexString(new Random().nextLong()); + } + + 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 mvndnative library using given path and name of the library. + * + * @throws + */ + private static void loadmvndnativeNativeLibrary() throws Exception { + if (extracted) { + return; + } + + List triedPaths = new LinkedList(); + + // Try loading library from library.mvndnative.path library path */ + String mvndnativeNativeLibraryPath = System.getProperty("library.mvndnative.path"); + String mvndnativeNativeLibraryName = System.getProperty("library.mvndnative.name"); + if (mvndnativeNativeLibraryName == null) { + mvndnativeNativeLibraryName = System.mapLibraryName("mvndnative"); + assert mvndnativeNativeLibraryName != null; + if (mvndnativeNativeLibraryName.endsWith(".dylib")) { + mvndnativeNativeLibraryName = mvndnativeNativeLibraryName.replace(".dylib", ".jnilib"); + } + } + + if (mvndnativeNativeLibraryPath != null) { + String withOs = mvndnativeNativeLibraryPath + "/" + OSInfo.getNativeLibFolderPathForCurrentOS(); + if (loadNativeLibrary(new File(withOs, mvndnativeNativeLibraryName))) { + extracted = true; + return; + } else { + triedPaths.add(withOs); + } + + if (loadNativeLibrary(new File(mvndnativeNativeLibraryPath, mvndnativeNativeLibraryName))) { + extracted = true; + return; + } else { + triedPaths.add(mvndnativeNativeLibraryPath); + } + } + + // Load the os-dependent library from the jar file + String packagePath = MvndNativeLoader.class.getPackage().getName().replace('.', '/'); + mvndnativeNativeLibraryPath = String.format("/%s/%s", packagePath, OSInfo.getNativeLibFolderPathForCurrentOS()); + boolean hasNativeLib = hasResource(mvndnativeNativeLibraryPath + "/" + mvndnativeNativeLibraryName); + + if (hasNativeLib) { + // temporary library folder + String tempFolder = getTempDir().getAbsolutePath(); + // Try extracting the library from jar + if (extractAndLoadLibraryFile(mvndnativeNativeLibraryPath, mvndnativeNativeLibraryName, tempFolder)) { + extracted = true; + return; + } else { + triedPaths.add(mvndnativeNativeLibraryPath); + } + } + + // 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, mvndnativeNativeLibraryName))) { + 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 MvndNativeLoader.class.getResource(path) != null; + } + + /** + * @return The major version of the mvndnative library. + */ + public static int getMajorVersion() { + String[] c = getVersion().split("\\."); + return (c.length > 0) ? Integer.parseInt(c[0]) : 1; + } + + /** + * @return The minor version of the mvndnative library. + */ + public static int getMinorVersion() { + String[] c = getVersion().split("\\."); + return (c.length > 1) ? Integer.parseInt(c[1]) : 0; + } + + /** + * @return The version of the mvndnative library. + */ + public static String getVersion() { + + URL versionFile = MvndNativeLoader.class.getResource("/META-INF/maven/org.mvndaemon.mvnd/mvnd-native/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/native/src/main/java/org/mvndaemon/mvnd/nativ/OSInfo.java b/native/src/main/java/org/mvndaemon/mvnd/nativ/OSInfo.java new file mode 100644 index 000000000..d0983eb1c --- /dev/null +++ b/native/src/main/java/org/mvndaemon/mvnd/nativ/OSInfo.java @@ -0,0 +1,213 @@ +/*-------------------------------------------------------------------------- + * 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.mvndaemon.mvnd.nativ; + +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/native/src/main/native/inc_linux/jni.h b/native/src/main/native/inc_linux/jni.h new file mode 100644 index 000000000..dc2c8f645 --- /dev/null +++ b/native/src/main/native/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/native/src/main/native/inc_linux/jni_md.h b/native/src/main/native/inc_linux/jni_md.h new file mode 100644 index 000000000..9b5d1a8ab --- /dev/null +++ b/native/src/main/native/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/native/src/main/native/inc_mac/jni.h b/native/src/main/native/inc_mac/jni.h new file mode 100644 index 000000000..cff1a02fc --- /dev/null +++ b/native/src/main/native/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/native/src/main/native/inc_mac/jni_md.h b/native/src/main/native/inc_mac/jni_md.h new file mode 100644 index 000000000..21cc90b33 --- /dev/null +++ b/native/src/main/native/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/native/src/main/native/inc_win/jni.h b/native/src/main/native/inc_win/jni.h new file mode 100644 index 000000000..2b11e7835 --- /dev/null +++ b/native/src/main/native/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/native/src/main/native/inc_win/jni_md.h b/native/src/main/native/inc_win/jni_md.h new file mode 100644 index 000000000..26a733df1 --- /dev/null +++ b/native/src/main/native/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/native/src/main/native/mvndnative.c b/native/src/main/native/mvndnative.c new file mode 100644 index 000000000..1d9b84c9d --- /dev/null +++ b/native/src/main/native/mvndnative.c @@ -0,0 +1,138 @@ +/******************************************************************************* + * 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 "mvndnative.h" + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { + return JNI_VERSION_1_2; +} + +#define CLibrary_NATIVE(func) Java_org_mvndaemon_mvnd_nativ_CLibrary_##func + +#if defined(_WIN32) || defined(_WIN64) + +wchar_t* java_to_wchar(JNIEnv* env, jstring string) { + jsize len = (*env)->GetStringLength(env, string); + wchar_t* str = (wchar_t*) malloc(sizeof(wchar_t) * (len + 1)); + (*env)->GetStringRegion(env, string, 0, len, (jchar*) str); + str[len] = L'\0'; + return str; +} + +JNIEXPORT jint JNICALL CLibrary_NATIVE(chdir)(JNIEnv *env, jobject thiz, jstring path) +{ + jint rc = 0; + wchar_t* nativePath = path != NULL ? java_to_wchar(env, path) : NULL; + rc = (jint) SetCurrentDirectoryW(nativePath); + if (nativePath) free(nativePath); + return rc; +} + +JNIEXPORT jint JNICALL CLibrary_NATIVE(setenv)(JNIEnv *env, jobject thiz, jstring name, jstring value) +{ + jint rc = 0; + wchar_t* nativeName = name != NULL ? java_to_wchar(env, name) : NULL; + wchar_t* nativeValue = value != NULL ? java_to_wchar(env, value) : NULL; + rc = (jint) SetEnvironmentVariableW(nativeName, nativeValue); + if (nativeName) free(nativeName); + if (nativeValue) free(nativeValue); + return rc; +} + +#else + +char* java_to_char(JNIEnv* env, jstring string) { + size_t len = (*env)->GetStringLength(env, string); + size_t bytes = (*env)->GetStringUTFLength(env, string); + char* chars = (char*) malloc(bytes + 1); + (*env)->GetStringUTFRegion(env, string, 0, len, chars); + chars[bytes] = 0; + return chars; +} + +JNIEXPORT jint JNICALL CLibrary_NATIVE(chdir)(JNIEnv *env, jobject thiz, jstring path) +{ + jint rc = 0; + char* nativePath = java_to_char(env, path); + rc = (jint) chdir(nativePath); + free(nativePath); + return rc; +} + +JNIEXPORT jint JNICALL CLibrary_NATIVE(setenv)(JNIEnv *env, jobject thiz, jstring name, jstring value) +{ + jint rc = 0; + if (name) { + char* nativeName = java_to_char(env, name); + if (value) { + char* nativeValue = java_to_char(env, value); + rc = setenv(nativeName, nativeValue, 1); + free(nativeValue); + } else { + rc = unsetenv(nativeName); + } + free(nativeName); + } + return rc; +} + +#endif + +#if defined(__APPLE__) +#include +#include +#include + +JNIEXPORT jint JNICALL CLibrary_NATIVE(getOsxMemoryInfo)(JNIEnv *env, jobject thiz, jlongArray totalAndAvailMem) +{ + jint rc = 0; + + // Get total physical memory + int mib[2]; + mib[0] = CTL_HW; + mib[1] = HW_MEMSIZE; + int64_t total_memory = 0; + size_t len = sizeof(total_memory); + if ((rc = sysctl(mib, 2, &total_memory, &len, NULL, 0)) != 0) { + return rc; + } + + // Get VM stats + vm_size_t page_size; + mach_port_t mach_port; + mach_msg_type_number_t count; + vm_statistics64_data_t vm_stats; + + mach_port = mach_host_self(); + count = HOST_VM_INFO64_COUNT; + if ((rc = host_page_size(mach_port, &page_size)) != 0) { + return rc; + } + if ((rc = host_statistics64(mach_port, HOST_VM_INFO, (host_info64_t) &vm_stats, &count)) != 0) { + return rc; + } + + // Calculate available memory + long long available_memory = + ((int64_t) vm_stats.free_count + (int64_t) vm_stats.inactive_count + - (int64_t) vm_stats.speculative_count) * (int64_t) page_size; + + jlong elements[] = { (jlong) total_memory, (jlong) available_memory }; + (*env)->SetLongArrayRegion(env, totalAndAvailMem, 0, 2, elements); + + return rc; +} + +#endif \ No newline at end of file diff --git a/native/src/main/native/mvndnative.h b/native/src/main/native/mvndnative.h new file mode 100644 index 000000000..b9a6cb4b9 --- /dev/null +++ b/native/src/main/native/mvndnative.h @@ -0,0 +1,160 @@ +/******************************************************************************* + * 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 __linux__ + + #include + #include + #include + #include + #include + + #include "inc_linux/jni.h" + #include "inc_linux/jni_md.h" +#endif + +#ifdef __FreeBSD__ + + #include + #include + #include + + #include + #include + #include + #include + + #include "inc_linux/jni.h" + #include "inc_linux/jni_md.h" +#endif + +/* Windows based build */ +#if defined(_WIN32) || defined(_WIN64) + + #include + #include + #include + #include + #include + + #include "inc_win/jni.h" + #include "inc_win/jni_md.h" +#endif + +#if defined(__APPLE__) && defined(__MACH__) + + #include + #include + #include + #include + #include + + #include "inc_mac/jni.h" + #include "inc_mac/jni_md.h" +#endif + +#include + + +#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 __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 + + #endif /* JANSI_H */ diff --git a/native/src/main/resources/META-INF/native-image/mvndnative/resource-config.json b/native/src/main/resources/META-INF/native-image/mvndnative/resource-config.json new file mode 100644 index 000000000..735487790 --- /dev/null +++ b/native/src/main/resources/META-INF/native-image/mvndnative/resource-config.json @@ -0,0 +1,5 @@ +{ + "resources": [ + {"pattern": "org/mvndaemon/mvnd/nativ/.*"} + ] +} \ No newline at end of file diff --git a/native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86/libmvndnative.so b/native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86/libmvndnative.so new file mode 100755 index 0000000000000000000000000000000000000000..4342fca9fc13f0fe2f4aefd6e7f8213998793ec4 GIT binary patch literal 5019 zcmbVQZ)_Y#6`!*Y#{`oYH|+u66@OAhu$B9TvufEq=kh@kzus1OOtU?d?75fvR`k9bs$ zYkf*%o8nIpv$Y5?3X{Y2&WnIrHS(7C@??8F7i2hA`2WG8vfp$;Mc3sC614E~*GljvTofdgJ zmn){kfIVwl#nP0OpDmlP|*G`E5?V!Z`1C&Ub%1TR}Ib44Y{#D*=xdGGu8w^JOs?H7nDzhyE7R&GW zpsVyg!{Oz(B;G~L&gDgkVO(VRvwTfrMr_6)epO;NGabYW61Nk_h%Zabp-dO?4Dd76 zcSkBK(K@iW`28EPM})Zi8yTeK3$+(kp>bu&dkj1A-#7r3`q$A@d9(Gs9rLrIvKXya zXxU$?Nm*;XvQ%EKRqk@yqSuCL^OfEI@crTXsG4`PLfetrH`Z?7Sa@LV>v%TRD)-df zJ(ZQ_`3l_})+XZ0M6Gs!D!08owHMadTJm6nH`%OON!TL_e;elUn zrST8tM!2P4(!?#=U195<_J4ub?EHxKejnz}R}AUVkRqjLq z%O6}E$DLeQfM@k_uT~UYPD&-m@o!>3St4GrE6L^zRVbUY zPRY#{3-g`d$RozY34=++eBLQ|`tJRA`30yjJ{d2JRq~4ghLACg+bkXfGhV637$zHFgqw_i z>M)ic2eXfQjCnF+U6XFc(ZRT-9%Gh_yDsNZm;GeE?=a5UW~`G9v?12lMN^yx z^Bg*~UI+5I<74!yA-x#%Vjr{a^U&k9*b$|yF$gIkl<`w2R<9-mDy=xw&&pFxlP^pEegT>#;CWPM$(1@<5$QSWUHAh{Na zu|Zp!b|9F3tpTLgqYT}4aSeyXA|}EG@dTLba{r9Qu)P^9@I+{$wgRzCpF+rfOR0_ zkM}cz_4AN?k0(WN(tD7->NZII%fL@#oGR20#{vEO0s7m6{nNi60?YGR>hBOgg$(=0 zSPA>L2>d5?o8@}pSf~BJVqCu;L>k`rS2$n$+wh3^C-Cd=Hv`$wuw694L4EzHzc=JC z@75QA!*y^hG;U!0D;mifV;wvP9Ik_3dtm-ALUs`~k2g+HVVTjeQ1qe+bKH#T$|9l_w|76sp9Y(KF|)!BZonmIc&% zA4>LHedms!PFg3DCr=GYg@K-scDiUy<%$z_&XTVTmR-Ii@H#M)LrI%96N#s~#0tdoOhP8=V!&h+(-BuA~$<0l4_R;U2qDCZye zRPeu5_o_lyUmmtt)CZpcf|;9tnCR}-<$R!hU%9Woa0K50So?4K8DqnSwaNDk`90!4 D9agM8 literal 0 HcmV?d00001 diff --git a/native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86_64/libmvndnative.so b/native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86_64/libmvndnative.so new file mode 100755 index 0000000000000000000000000000000000000000..70e268d9cc099505cb57438ac5a74dbd4282e172 GIT binary patch literal 6995 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 literal 0 HcmV?d00001 diff --git a/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm/libmvndnative.so b/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm/libmvndnative.so new file mode 100755 index 0000000000000000000000000000000000000000..24eb9d75af1c0f31ad69d4a6b940d92281473f86 GIT binary patch literal 6000 zcmb7IeQZ=&6+dsLg;EN1OZix6bYL4rrNf8~=^8XsO8H9pu$1hQZ1Va#^Gau(4|e9Y zwn~)!AYz0Cch|@tYDfQbLtIRV5p~xOTwT`~aTk-#?*1_YOhA?dHmn9WhVl1%_uck( z0L9asIp^GS?z!*Yd+xpG^lQC+n=H!`4PjX&l#=x#ouGpYMM5E|@05ttL$^$p_jFFvs<9nBQR}`?@sbel0QPSN z(ykR425#Q5M+VytEqSB=tD)RGCF{>WFa7A$p_Zqqn+K%rY#=@_eo!LcI9ylP{Y-t_ z*U{G^puE(1Wkc`ZuKnWTa|d2|`;p~u^n~UOuQ+q=ttTFBJ9G5?`C|j?U%2|__4yYb zdg|G|*S|BtF12ut0|CM^$ET|>ZzVTNzt5?kl^|_~907mYkXyk2xJEu$BP-9UF#=Lj ztpCgYjv+_Dch$(34Vm_BaJXxZ^4g4*{Sa+^Q}RMtQ=?yABcFl&2`utBXp791uY;x` zuMT8}-?YD0e-HI~wP3yG)#w+aUo+x|&>~GT3i>WKzsZ;9%ExQQ7u(*K$z|<==j1)x z7CV(qd14QPh`n`SyPb6N?!HvPbMph+d(yeAJKzkZU8TFb#!ieobl{{@UxwkfF}pwT z(35rw1-BsEc5JnGX8UqZQZi0DolD3zXUws4`F(a~ESq#(ei1o4>v*X#yQeQTly~wI zc48!%%FA%xb?>)F!S&qin2crvCY>5eL<_m-IiVqXZn6PAFs2XqT!iE=0C zA{@*vQk<9dq}b;;X`{$S(zzl_K^McWjTDzogcSSVPKvl%Mauhy6vr(_ir{F7cl>?1 z$a@X(m#=)Jx~5!L>ZsI}CM)wx$4U)1Ua3eOKJfR)E;PS>27eBGYizR88kwwwW5-IN$n%#)`Y&R9>w2|%^+ec`80QX~PEj@@$4cSY(-*?A z!O|?*eK7(Z`=ZacmcmacMjyL<9}6*$)9`T$_!y99s;haj(gj~u^RW_rSAsP(6}|RL;rq3ag%?HS8tA*g_4sCv#c!6_aeo~6^XHD8S;oG9 zz?!ugM3OVn5k) zQT7+hI1Y{VXrG0?uLgd(=CdKQeXlXbHt<--tB(Y2wCM%Uac>3Va{culVQb_F&lMk5 z0Qw5gHSby8&wM|54?hUXGmW$5zo*MUdA9kE@!9*w?P~58DD#6$xJc-30L~CQ@_A6q z!M`i`CO6@%@~&ar@eO|f$h+Y*9Fg}x`6k7INKFL8%k644H-PpksQ-_{cWmqwhzh(wbUS@cxY%PY;8n=hnt*%^WjUEWR8UNQUAo<#lEGU~bG;Qco<>Wfz12 z2b>Su!+r#cFqQ~mKT=dIDOv3{V@%1|L;z!f5cVSw_EWM7Y{rz*t#J>7OC<0 zbV>JLi{9y45g)}ebVg4WlDbS(wWTVfjXLr^>)fDN^~+szh&u}B8Or~shOR05)qtiq z&IHR8%x8MycP;4sMbnWq>_0PXK7$l8v150Uke25om34YZ>R zzL!L;qpjwj1JA6G^W(eD|D$Rhnx^>ggJ-r#JLVVd_po~rdX7swzQe2TVfPaBTszwF zz2*OBOW^g`q-c_#0kuEAyG_`f^=Q*TJ0kNOZO8Y03+%Kn+G_qRc>3kIe0Tb4?C68= z8jyU90)Td%iuHe~BmNZ#U;F(={2YWG|0kkB`(rK1F*TfoU0DmD+K$xNb~%oqJBL_c X&AS=Mc`(k3)gpw|`uYQn=(|GsV7P2DQSL0*gvvt=#cyiyH-Qn*(|IQQk+s}19dE?J*=f5&V zswAI>56z2~{17e)K;Ze8s;U}anh{bm@>zoqyt3iLaMN4=eD&%NpFaQY*OvVy;-A-9 zd+y@fPqi&S_x&65dt0A4{`X5C&42&l!#~*n(TRRCxmz<}7BujC*7Xcn2yMKsf-lET zKp2fqV1Kd3OLq@;RtlrhLF|{)r`Hm|$J>5^Kso)h74W}Rz%9fB_;_0b0s$|G{Bj@Q zD%8N4x!BR#r`TVJZ+66k*HzG8RslbUeip+V7@6fdKf+@?$9Om66dyI(q7;vJT>3T^ zmwAu#D(F9;^yk7l-aq7##Mq|I#3a&o2#W+I))f!T=! z%QUBr|Ed)#^yvuB^PojP+UMz)B{*gNi$P%{}ZPlC-i}I}1B@ zZ8vwPn=@7%QdTmViNOx5*D^EC0W;N`j$1ZGL_ITYxw5F=yYuR zUM;eA&QAA2PntW)L`N)`%>*}sX~(Uch4b&oX5H!QeOd}7u`vqjGerVho41D}W_@t| zW4yRX{OYGb>6|P7EthR+cvNVjRYd}}1`V%(48@)VR+w}$KE_G!3&P7i9h z9?uaC=Os}7k7_t?J%yjtaDB^64!k}(X~58Gfa8+`Z;Xr^=4CRtj`&f4ql@aJ`Gtqq z4+Z=yF0Tj}Z^@%%8&P)3l_~yly#7{4tcbpK>;ZeDJ7> z>%nLq=~>lpiRNFMnmX|gJ^>iq(|)Rc)6F@d{N%s|wYIe0q(^HG?T-xkAe6TNeno4K zHcKhC+CVgaXle>$-hBB}#6svN0K*Q&KRNI_6^9?~ZtnGs-uk+KG<-CiziGhOCx&k< zgf>?VSkvwg<*yhIjGbNqdH--YKVd9UvYMwu$A)LZ&`FH%W3(ygh4R;o>M=i#H6s^M z`ork!#|Iy6m_YpI-bNfNJUTh>d!EPn(JO|3jOIacyvzPxK#H-fA)6PmkK?W(+rs?a z_*Lvn0OR(rp%`yrEEoK6mVEw!eVtwr%AfWTW{gc3HDhlePI_0cPySb8tlyj-uVyTR zeca>KPfcUhV+XNMG2B{0>qT)${O)(JfAesc=407)rn1*1@1Wd=n*2TboXbw1W6PMA zz4{RIa-LCMLQUki?o4HfALN1MtZ3lFM9zo_mdl>r%)FdYlJ3gc*COWtImb5Q5|!go zSI(HFj34EJ1i#3ENSx!WCufa}cW26t{|xI-F+aVI%=fW8&%DIRZvSsY^6LN9VGA$B zXQeXk)=1>>!0Ih_N5V?iHDi+CWC9z4n}YRg*ROlT?SZRP0z)v{pUPPsNOO)$yQG)S zUU+*KNv%2=*LPWVmL?!P4QPy`BQmE5Yr9_#xkjt zozBVXl&1#f3UbfUH4MxbWPcRn2FSiB#;ZW~Pcc3N0UeJ?Ivy3Sujo66(Pf-Q1DD(~WdE;M-F%f1SJ+7b6*HtfBx%Dg`I_)noe z&C82p?xOJ3azGH42Uocu^0t<>-r-B*3uJx$)e>!D!-S)J&=cmeb_0d@A@y@M|6MomDyjee(C#Kqx4I0 z8o%7Q8-HhP$0Iy}7Nvh<%DW%;v!4;qezaNNyHDNkYBqFxzN-P$5Aawz zIe~b&d;3ojFIU(24dUhMCYRXH8Bd&lRd{JV;sfQsbU*&1f}ejYeLZrwKiglvPSL=) zw_Xro+*`lsMm$jJ9-cwGT%F}v<)_r(6;q zLS0YRsl%#4on<+(u8kYkCKKtNzO|TZ)Ww`!BA9_yeGtPchWTyV`j*+5{x243v_Qjb zuBWpz7{kKCj>sOfdHdd0tTGg8EoLrd#;Dqo1u3#<(5g7v#WUuCWTwMPn(nu+w|*^Jp`rQ=vCI!LvhTn39bmILON{ks}>ZjazVSWgo5t?bdceA+0cD7FD5&MO5&Sa*kUAa?4#>y~iy} z6`9>*iHhq?T8Zl(4c*$7w;V_HCM79~g(_f0z;u18urAXzuVTeA}CFGwhyzOLteL+d{}6UEDYPxTIuasWORF}a|o4j z#Kvp?0^7?la$gbZ)%Wtp(SANY@_wW~EdO_t^_KCy{4fd@X!dgdY2p0btMBE1jW_a`0wc;_Qg(M;^o^FjOaKQ{!VfpO?5wtMdmN(2i3>Qjo(&-0&GHq)$ literal 0 HcmV?d00001 diff --git a/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/armv7/libmvndnative.so b/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/armv7/libmvndnative.so new file mode 100755 index 0000000000000000000000000000000000000000..379cc0426a62e8852a1d443c00a3f4c42040ecac GIT binary patch literal 5736 zcmb7IYiv}<6`s4hHf!^8i~+~Cs*UZmj=*c3Pg95#cB^LiI}CB{@jN6G?|sQ2XQD!8V4$Rw?MX2uQ!-qSd~ z3`DyMkQ>ywYma!P`qY`y-MJfe`+hX}?+d^B>rm;~H~;cn^*imZ)x(dSzjST?-kS5@{AkVi!1nKaaAj`I z^|~Y9dVcP^lN?gmKIBAbZc!q61>RfXGSM$3^-~L0>k)@h9l|7NGxMV(gQo&}B7k*a=EuXTdkX&P$F%XB9ctzl?kZ<|D_rN^)$s8uC@JZ*9DV zn7i#gJU#2lHqLmmr)Sn=k7vDi-kiDP!o$6F{Ce3RU%h_k@4ueW@~lJ7I^=5(`I19^ z+adoJaz*p$nF`43_jx1WT$8245*NZeQNtUFN=2 z)bqW?F^6C~0SbV)zr9nXy`?<|g9n1u6EB@Ff%m$z-rj@3%4lx>=v;1oI#=9l)E*30 zje4g;7~=soU|b9Mr$H;ayi*fFSF{*o%Fj>FdRs5t^k6=*Y2nhT&W~^2KqUMQ8(GFn z*JvlB!yRqB^^Z1B=*q&0mbIZ%opsS|kk7On4*7tJLq>CMe(xN6MQu??obW+wUu+L$ zJ4IbX=x2Leznq@E^VO|WkA!mb@8*i|`}CYA)BxT*=L>C}9-S%<)r8(TOZ^|9x6eKn zYKD9*GF~NAitBNNOL$}l=hNl;TF^sSg zJd1c&@XUFXeTds?a31MA!x+arvx)!pNiMYjPB%BOY2Z=}z!}0e-LRK zC+B|cY;S+s*AR>h#;l|-;NRwNY24EMgp%^gd%D|N;KhnqgE3(+wu(O2*d~fgSG0MJ z5?86G+*4t!H#WK}jYo|tSGBvws5OK?GnufhL2x^*cvMTtlpXPpB**-NW3hO+F%}jQ zMXgL!_`{P)j8xoCE6sQ$or$HA%YX@8IufV75=P^;@XHIrZ$~B|%WJ|PiJHS{D-lsT z(@LkUNu|^Bz9G1R8!HhT!W1bCm4~k%XRq)Nr4orq5`As`JN=ezr(=U-Hm-^LwX69~ zw~Rup%_3&BsCXiGt~@jX`p!;IHSge!kZn zdfK0J;8%gC3hb{r^n5@4J$cG-{H#NN8d#r+dcF!3M$oJjQ}|`>#uYK}{ppYAp=xWz z?;Y5{deeV{WBhGkp1W+?f0si~e>`thTO;Nj*g!l{uX9J9q8qd+`uROM-#~%Cy$($M z3l3bk9`vu{nYTb4{A+9gQ?J*HC;JxYHRk#`8=vR%(ChDQ;CuG~e;M4p_&( z0s9w$_50C24$OOljrzyI_5S27BcFG1{Yqtgu5#cbYN#Avi{I}%un+hRU_Bpm{kI%? z-bH@~cGd##Ewf)IW@(>~?{dWV-wN#S0y}GghWy!uQF3>019s-}!223sfNwi6{pW!7dB9plG>v7_O~}BTtaPF=9!ri* zG~$lpr57D;8cN$Se@fI_VhA;X`Eta1$sA6K`tbi8mc%fO&e&ta!~P-U>OJlKW?%QS z14!KKZLw6rn0CS(VhxiKx^!`LnPxa;j>J=gR@@BRsdUD)#wG+Vr_nfyh_HWKb8`UB z?_(s(C3V-KPO#IHC{b`9n&GiTViH3fNY+=&Oj+m1GAAORJ=EW}v%~Dz6_iy6-$cvd zOv;Q}$uO#~eJq#k6zU->EzIEayV`bkw__rdXxhB9Z}*P2K67^{^lZm~IncJFuY+Zb zvo>pOU8-dMYpu6bBH^J}eJvZw`bk$us-#lYqoaI!$nq{qA(G0%(1Aufw*4S&r*r+N)TkfYkq&{h9rGa48Fu8G_ICtW+sOsQBJ#O) z({{(uK|8)L?@f}{(N@bRAu~JV`|-Z#{|~heU5oM$ATw*E9rKK`2iW}-dd^Eb-p3UW zuzMYPemmOn-sS%#vyk=N fZif+!mk*{Z5AGwzsMFsUu{cGJ4(;zhMXarr literal 0 HcmV?d00001 diff --git a/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/ppc64/libmvndnative.so b/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/ppc64/libmvndnative.so new file mode 100755 index 0000000000000000000000000000000000000000..2387b10be432510697a0f2d5caa5c32e0e304b6d GIT binary patch literal 8240 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 CNy2#m literal 0 HcmV?d00001 diff --git a/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86/libmvndnative.so b/native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86/libmvndnative.so new file mode 100755 index 0000000000000000000000000000000000000000..b41e7ed998a91b011b745ea2218fd9fe7a79664a GIT binary patch literal 7240 zcmeHMeQZIG|kZ-!N@_31z*wi1?eohlc z)dUOL)XSF9Y1>~L5}UM1h^=cU6){bLFbYzoG1hKKLsK?jGi#<&HA4|%^?twme3O@y zPH2DUpyP9X_ndp~=gYnK@RGN2lf&TJ zl4mih2vIC7`~A>YSnNi?a`1wzJqNM?_5#?+cubJ=TYivINoz-n_kCZKnxzx(s};E9$CFEr$T z`JE4FyARBwRzH)YT&gF4g4}c0Y3R;^pU`DLXm*VbMST z@IlelM-P4rF0<$#HnaqKnGI{u-?U-cPt3tBHoOx0fDO~1V^gF-8CL+3cEg4>=v8y@ zZD2PIpkncWC`7<=O+w&OaT4khtjl3aQ6OH1d=HcJr7Y$)o2g$a*W$aJbZO5=L?M2F z`lKb8#RTLY)L$fVfe^ah6OKmoxM{>pT^D*V5;TS04I%V~wr#r4AM^JFwyiD{ zjriM)&XC`--QA*h^%)Fcgo69wxV2Yr$wsIP8S%J3F1BuO(04={qlQm}jZi4sCAJ#9 zh8~Ue=;7Xo&+xNH)bxm927C3o#$ad6i1q7T0bejCx?_I-z1E2PO@E|UBqCWQ6zuHs z#G{@KLihU&)4=#U<8f>FD2n*R=EjEFI(@CD((}Z$UV+)-uFSzdXI2Bm>d*eik{odp z7Jd_?_=;dYcl{Eq6U&N&L2Tt5@i4F?e5?4>g)1vH&B7DF3((|EO8gO+q{KQ-Q6l0U zN-Sal{1-AdB|e}MO054fO007kB^qc=PUNLu6G9A*buAYnm7L6EGKWUZ+;lGrlV|gG zjX_$Jd4n4$bBz5WWsYH=hyc|aZ{XV~9vsuz18#c9a_3W3SPpzD zq6DTkNE5OT@=bL1n~=YOJPx@UUAYX|4T%L1-1Q{K{ubdlkmp!l;Bvi!at&qN@o!;c z?ST|Ud7Fv~w%&iA>FN_-dFZLnt#z;D$5IWRgb#HR>#%(d?eXuks42=jl(V@ox8}Eq zjB^1+CU_C-&rREF3v=sUb{=*mb90QbnsYU8OK)zwqu>Vk@~p68!MFCXGwDjuQ3hqq z^Wfd^J3Q@IKNEBROiY^RX?_OgXJCE?=4W7j20m>DG#sWEac3prIF$Ec-XQrd;X97+ z5!@i;TNZaw`8LG8O5TBa2EtAJ`{PWs3Y8h=IIb-`pAP`@T;#i#Z$h4%d@~Box}EbZ zpB;R7y;Lm{bz&P%rcTgEec@*IUu5rReg4ibCMs831=`w*%8eE4D>tZE zb0y#MBrCgsx8*d(gn>9;B<3GToJW#V&ae<1uZ69};(S<`vu(|rg|T2D&L_z!XV6+t z3*$io8lASw+l$bwu<++6e4Xk3(Uj#lGzymf+`v|a# z$2`jS=h%M=to9r8ASZzBd6g?R|CNY01-u92;ZA1W#hLwf0OjA3rNH()Os&nX!KcL* zkNs3vljJUxC>-`Ay^ zfkfmvPiG%IK2hppsV^SY14hJ$B-CDJjm#+0LPkvJ^^tG7*WtEp}D>eC6L>S~q$sraAyFXo_T`C8c|nV_0gE;DKO znBL0fsPtJGw3%qkNPQx8He;^1*PNJ@MVp)WWA1BKGVCsiJDCx@d)80p4TUG(A2y9n zNHb>1fYKsS)9>ktBs`soV92*7=o1nJjCeqJeEkvBw4@ocEWQ3%JQ$740y=Cle~A8; zvM*!`k8Ilm)zcFNH2r<}l@ssr2eMl<;6qh~tSZ)CwLF!+w+n8FZiItfXgO*!EJ~Ov z^dM6xJoswD_!6v7`JR6Hx1WFd_(|LI@2Yb4*c3byZsGnxKc3}eo(t+eLO(L|6+BVt z$1|Q>0j3Q?N|j$=UHb9tC-d&4NU2*;zc zJ}_?t^yA%&Tn$~tqd$+LFqnR|VBRgr<x|irA@JI*+m=tiqRO~EMEY#T@=Z^ d%r+JIFxcS{tcXg1wtm1EgN;6>IRj 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 1024, "Total: " + mem[0]); + assertTrue(mem[1] > 1024, "Free: " + mem[1]); + assertTrue(mem[1] < mem[0], "Free (" + mem[1] + ") < Total (" + mem[0] + ")"); + } +} diff --git a/native/src/test/java/org/mvndaemon/mvnd/nativ/MvndNativeLoaderTest.java b/native/src/test/java/org/mvndaemon/mvnd/nativ/MvndNativeLoaderTest.java new file mode 100644 index 000000000..43871dd76 --- /dev/null +++ b/native/src/test/java/org/mvndaemon/mvnd/nativ/MvndNativeLoaderTest.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2009-2020 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.mvndaemon.mvnd.nativ; + +import org.junit.jupiter.api.Test; + +public class MvndNativeLoaderTest { + + @Test + public void testLoadJansi() { + MvndNativeLoader.initialize(); + } +} diff --git a/pom.xml b/pom.xml index 642984787..d51f962fc 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,7 @@ build-plugin + native agent helper common @@ -173,6 +174,11 @@ ${assertj.version} + + org.mvndaemon.mvnd + mvnd-native + 0.5.0-SNAPSHOT + org.mvndaemon.mvnd mvnd-agent @@ -284,6 +290,11 @@ limitations under the License. mvnw mvnw.cmd pom.xml.versionsBackup + **/*.so + **/*.dll + **/*.jnilib + **/Makefile* + **/docker/* SCRIPT_STYLE