452 linhas
13 KiB
Makefile
452 linhas
13 KiB
Makefile
#
|
|
# Makefile for JNA native bits
|
|
# Copyright (c) 2007-2012 Timothy Wall All Rights Reserved
|
|
#
|
|
# You may need to run 'ant javah' at the root before performing a build from
|
|
# this directory.
|
|
#
|
|
# To build with debug information, use 'make DEBUG=true'
|
|
#
|
|
# Supported platforms (built and tested):
|
|
#
|
|
# Windows 2000/XP/2003/Vista (x86/amd64)
|
|
# Windows CE/Mobile (arm)
|
|
# Darwin/OS X (i386/x86_64/ppc)
|
|
# Linux (i386/amd64/ppc/arm)
|
|
# Solaris (i386/amd64/sparc/sparcv9)
|
|
# AIX (ppc/ppc64)
|
|
# FreeBSD/OpenBSD/NetBSD (i386/amd64)
|
|
# Android (arm/x86)
|
|
#
|
|
# Built, but with outstanding bugs (not necessarily within JNA):
|
|
#
|
|
# Linux (ppc64/ia64)
|
|
#
|
|
# The w32ce build requires cegcc and phoneME for cross-compilation; if these
|
|
# tools are available on the path then "ant -Dos.prefix=w32ce-arm" should
|
|
# result in a proper build.
|
|
#
|
|
# The android build requires the android SDK+NDK for cross-compilation;
|
|
# make the tools available on the path and compile with
|
|
# "ant -Dos.prefix=android-arm(-x86)". Put the NDK tools in the path and adjust
|
|
# NDK_PLATFORM below or set it in your environment.
|
|
#
|
|
|
|
# Systems which support POSIX signals may be able to support VM crash
|
|
# protection simply by defining HAVE_PROTECTION. This option has been only
|
|
# been enabled for those platforms on which it has been tested successfully.
|
|
|
|
OS=$(shell uname | sed -e 's/CYGWIN.*/win32/g' \
|
|
-e 's/MINGW32.*/win32/g' \
|
|
-e 's/SunOS.*/solaris/g' \
|
|
-e 's/NetBSD/netbsd/g' \
|
|
-e 's/GNU\/kFreeBSD/kfreebsd/g' \
|
|
-e 's/FreeBSD/freebsd/g' \
|
|
-e 's/OpenBSD/openbsd/g' \
|
|
-e 's/Darwin.*/darwin/g' \
|
|
-e 's/AIX.*/aix/g' \
|
|
-e 's/Linux.*/linux/g')
|
|
|
|
JNA_JNI_VERSION=4.0.0 # auto-generated by ant
|
|
CHECKSUM=1a6047467b59e8748f975e03016ce3d9 # auto-generated by ant
|
|
|
|
JAVA_INCLUDES=-I"$(JAVA_HOME)/include" \
|
|
-I"$(JAVA_HOME)/include/$(OS)"
|
|
|
|
BUILD=../build/native
|
|
JAVAH=$(BUILD)
|
|
INSTALLDIR=../build/$(OS)
|
|
JNIDISPATCH_OBJS=$(BUILD)/dispatch.o $(BUILD)/callback.o $(EXTRAOBJS)
|
|
RSRC=$(BUILD)/rsrc.o
|
|
DLLCB=$(BUILD)/dll-callback.o
|
|
ifneq ($(DYNAMIC_LIBFFI),true)
|
|
FFI_SRC=$(shell pwd)/libffi
|
|
FFI_BUILD=$(BUILD)/libffi
|
|
FFI_LIB=$(FFI_BUILD)/.libs/libffi$(ARSFX)
|
|
FFI_ENV=CC="$(CC)" CFLAGS="$(COPT) $(CDEBUG)" CPPFLAGS="$(CDEFINES)"
|
|
FFI_CONFIG=--enable-static --disable-shared --with-pic=yes
|
|
endif
|
|
LIBRARY=$(BUILD)/$(LIBPFX)jnidispatch$(JNISFX)
|
|
TESTLIB=$(BUILD)/$(LIBPFX)testlib$(LIBSFX)
|
|
TESTLIB_JAR=$(BUILD)/$(LIBPFX)testlib-jar$(LIBSFX)
|
|
TESTLIB_PATH=$(BUILD)/$(LIBPFX)testlib-path$(LIBSFX)
|
|
TESTLIB_TRUNC=$(BUILD)/testlib-truncated
|
|
TESTLIB2=$(BUILD)/$(LIBPFX)testlib2$(LIBSFX)
|
|
|
|
# Reasonable defaults based on GCC
|
|
LIBPFX=lib
|
|
LIBSFX=.so
|
|
ARSFX=.a
|
|
JNISFX=$(LIBSFX)
|
|
CC=gcc
|
|
LD=$(CC)
|
|
LIBS=
|
|
# Default to Sun recommendations for JNI compilation
|
|
COPT=-O2 -fno-omit-frame-pointer -fno-strict-aliasing
|
|
CASM=-S
|
|
ifeq ($(DEBUG),true)
|
|
CDEBUG=-g
|
|
endif
|
|
CFLAGS_EXTRA=
|
|
COUT=-o $@
|
|
CINCLUDES=$(JAVA_INCLUDES) -I"$(JAVAH)" -I$(FFI_BUILD)/include
|
|
CDEFINES=-D_REENTRANT
|
|
PCFLAGS=-W -Wall -Wno-unused -Wno-parentheses
|
|
CFLAGS=$(PCFLAGS) $(CFLAGS_EXTRA) $(COPT) $(CDEBUG) $(CDEFINES) $(CINCLUDES) \
|
|
-DJNA_JNI_VERSION='"$(JNA_JNI_VERSION)"' -DCHECKSUM='"$(CHECKSUM)"'
|
|
LDFLAGS=-o $@ -shared
|
|
ifeq ($(DYNAMIC_LIBFFI),true)
|
|
CFLAGS += $(shell pkg-config --cflags libffi 2>/dev/null || echo)
|
|
LIBS += $(shell pkg-config --libs libffi 2>/dev/null || echo -lffi)
|
|
else
|
|
# -static-libgcc avoids gcc library incompatibilities across linux systems
|
|
LDFLAGS += -static-libgcc
|
|
endif
|
|
# Avoid bug in X11-based 1.5/1.6 VMs; dynamically load instead of linking
|
|
# See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6539705
|
|
#LIBS=-L"$(LIBDIR)" -ljawt
|
|
STRIP=strip -x
|
|
# end defaults
|
|
|
|
# Android build (cross-compile) requires the android SDK+NDK.
|
|
# Ensure the following tools are in your path and adjust NDK_PLATFORM as needed
|
|
ifeq ($(OS),android)
|
|
ifeq ($(ARCH),arm)
|
|
PREFIX=arm-linux-androideabi-
|
|
COPT+= -mthumb-interwork -march=armv5te -mtune=xscale -msoft-float -fstack-protector
|
|
HOST=arm-linux-eabi
|
|
else
|
|
PREFIX=i686-android-linux-
|
|
COPT+= -march=i686
|
|
HOST=i686-linux
|
|
endif
|
|
CC=$(PREFIX)gcc
|
|
CPP=$(PREFIX)cpp
|
|
LD=$(PREFIX)gcc
|
|
RANLIB=$(PREFIX)ranlib
|
|
STRIP=$(PREFIX)strip -x
|
|
CDEFINES=-DNO_JAWT -DNO_WEAK_GLOBALS -DFFI_MMAP_EXEC_WRIT=1 -DFFI_MMAP_EXEC_SELINUX=0
|
|
COPT+=-fpic -ffunction-sections -funwind-tables -fno-short-enums
|
|
NDK_PLATFORM?=/Developer/Applications/android-ndk-r7c/platforms/android-14
|
|
JAVA_INCLUDES=
|
|
CINCLUDES+=-I"$(NDK_PLATFORM)/arch-$(ARCH)/usr/include" # -I/usr/include
|
|
LIBS=-nostdlib -L"$(NDK_PLATFORM)/arch-$(ARCH)/usr/lib/" -lgcc -lc -ldl -lm
|
|
LDFLAGS+=-Wl,-shared,-Bsymbolic
|
|
FFI_ENV=CPP="$(CPP)" CC="$(CC)" CFLAGS="$(COPT) $(CDEBUG) $(CINCLUDES)" CPPFLAGS="$(CDEFINES) $(CINCLUDES)" LIBS="$(LIBS)" RANLIB="$(RANLIB)"
|
|
FFI_CONFIG=--enable-static --disable-shared --with-pic=yes --host=$(HOST)
|
|
endif
|
|
|
|
# W32CE build requires cegcc cross-compiler and phoneME JavaME implementation
|
|
# cegcc: http://sf.net/projects/cegcc
|
|
# phoneme: http://davy.preuveneers.net/
|
|
ifeq ($(OS),w32ce)
|
|
ARCH=arm
|
|
CC=arm-mingw32ce-gcc -mwin32
|
|
CDEFINES=-D_WIN32_IE=0x400 -D_WIN32_WCE=0x0420 -DNO_JAWT -DNO_NIO_BUFFERS -DWINCE -D_WIN32_STDARG_H
|
|
CFLAGS+=-Wno-unknown-pragmas
|
|
LD=arm-mingw32ce-gcc
|
|
LDFLAGS=-o $@ -shared
|
|
LIBS=-lcoredll -lgcc -ltoolhelp
|
|
WINDRES=arm-mingw32ce-windres
|
|
EXTRAOBJS=$(RSRC)
|
|
STRIP=arm-mingw32ce-strip -x
|
|
LIBPFX=
|
|
LIBSFX=.dll
|
|
HOST_CONFIG=--host=arm-mingw32ce
|
|
# libffi must use GNU ld; jnidispatch.dll requires gcc
|
|
FFI_ENV+=LD=arm-mingw32ce-ld CPP=cpp CFLAGS="$(CDEFINES)"
|
|
PHONEME=../phoneme/cdc/src
|
|
JAVA_INCLUDES=-I$(PHONEME)/share/javavm/export -I$(PHONEME)/share -I$(PHONEME)/win32 -I$(PHONEME)/win32-arm
|
|
TESTLIB_TRUNC=$(BUILD)/testlib-truncated.dll
|
|
endif
|
|
|
|
ifeq ($(OS),win32)
|
|
ARCH=$(shell uname -m | sed 's/i.86/i386/g')
|
|
ifdef $(MSVC)
|
|
USE_MSVC=true
|
|
endif
|
|
|
|
CDEFINES=-DHAVE_PROTECTION -DPSAPI_VERSION=1 -DFFI_BUILDING -DUNICODE -D_UNICODE
|
|
ifndef USE_MSVC
|
|
LIBS=-lpsapi
|
|
else
|
|
ARSFX=.lib
|
|
COPT=
|
|
LIBS=psapi.lib
|
|
endif
|
|
WINDRES=windres
|
|
EXTRAOBJS=$(RSRC)
|
|
STRIP=@echo
|
|
LIBPFX=
|
|
LIBSFX=.dll
|
|
TESTLIB_TRUNC=$(BUILD)/testlib-truncated.dll
|
|
|
|
ifneq ($(ARCH),amd64)
|
|
ifdef USE_MSVC
|
|
CC=$(FFI_SRC)/../cc.sh -m32
|
|
CPP=$(FFI_SRC)/../cc.sh -m32 -E
|
|
LD=$(FFI_SRC)/../ld.sh -m32
|
|
FFI_CONFIG+= && rm -f include/ffitarget.h && cp $(FFI_SRC)/include/*.h $(FFI_SRC)/src/x86/ffitarget.h include
|
|
FFI_ENV+=LD="$(LD)" CPP="$(CPP)"
|
|
endif
|
|
|
|
ifeq ($(CC),gcc)
|
|
# -mno-cygwin is only available on GCC 3; GCC 4 requires an explicit mingw
|
|
# installation
|
|
GCC_VERSION = $(shell gcc --version | sed -n 's/.*(GCC) \([0-9]\)\.[0-9.]*.*/\1/p')
|
|
ifeq ($(GCC_VERSION),3)
|
|
NOCYGWIN=-mno-cygwin
|
|
else
|
|
NOCYGWIN=
|
|
endif
|
|
CC += $(NOCYGWIN)
|
|
LD += $(NOCYGWIN) -Wl,--add-stdcall-alias
|
|
endif
|
|
|
|
else
|
|
|
|
# Undefine USE_MSVC to enable mingw64 cross compiler; ensure $(MINGW) is in
|
|
# PATH. Should build properly as of 111121, but lacks SEH, so MSVC build is
|
|
# preferred
|
|
MINGW_PREFIX?=x86_64-w64-mingw32-
|
|
MINGW=$(MINGW_PREFIX)gcc
|
|
# Still need windres from mingw distribution, even if building with MSVC
|
|
WINDRES=$(MINGW_PREFIX)windres
|
|
ifndef USE_MSVC
|
|
CC=$(MINGW)
|
|
endif
|
|
|
|
ifeq ($(CC),$(MINGW))
|
|
# No SEH under mingw64, thus no HAVE_PROTECTION
|
|
CDEFINES=-DPSAPI_VERSION=1
|
|
LD = $(CC)
|
|
LDFLAGS=-o $@ -shared
|
|
LIBS= -lmingwex -lpsapi -lkernel32 -lmsvcrt
|
|
FFI_CONFIG += --host=x86_64-w64-mingw32
|
|
else
|
|
# MSVC (wrapper scripts)
|
|
CC=$(FFI_SRC)/../cc.sh -m64
|
|
CPP=$(FFI_SRC)/../cc.sh -m64 -E
|
|
LD=$(FFI_SRC)/../ld.sh -m64
|
|
FFI_CONFIG+=--host=x86_64-w64-mingw32 && rm -f include/ffitarget.h && cp $(FFI_SRC)/include/*.h $(FFI_SRC)/src/x86/ffitarget.h include
|
|
FFI_ENV+=LD="$(LD)" CPP="$(CPP)"
|
|
EXTRAOBJS+=$(DLLCB)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(OS),linux)
|
|
ARCH=$(shell uname -m | sed 's/i.86/i386/g')
|
|
PCFLAGS+=-fPIC
|
|
CDEFINES+=-DHAVE_PROTECTION
|
|
LDFLAGS+=-Wl,-soname,$@
|
|
endif
|
|
|
|
ifneq (,$(findstring bsd,$(OS)))
|
|
ARCH=$(shell uname -m | sed 's/i.86/i386/g')
|
|
PCFLAGS+=-fPIC
|
|
CINCLUDES+=-I/usr/X11R6/include
|
|
LDFLAGS=-o $@ -shared
|
|
CDEFINES+=-DHAVE_PROTECTION -DFFI_MMAP_EXEC_WRIT -DUSE_DEAFULT_LIBNAME_ENCODING
|
|
endif
|
|
|
|
ifeq ($(OS),solaris)
|
|
ifeq ($(ARCH),)
|
|
ARCH=$(shell uname -p)
|
|
endif
|
|
PCFLAGS+=-fPIC
|
|
CDEFINES+=-DHAVE_PROTECTION -DFFI_MMAP_EXEC_WRIT -DUSE_DEFAULT_LIBNAME_ENCODING
|
|
ifeq ($(ARCH), sparcv9)
|
|
# alter CC instead of PCFLAGS, since we need to pass it down to libffi
|
|
# configure and some of the other settings in PCFLAGS might make the build
|
|
# choke
|
|
CC += -m64
|
|
LD += -m64
|
|
endif
|
|
endif
|
|
|
|
|
|
ifeq ($(OS),aix)
|
|
LIBSFX=.a
|
|
PCFLAGS+=-fPIC
|
|
CDEFINES+=-DHAVE_PROTECTION -DNO_JAWT -Wall -D_AIX -DPOWERPC_AIX -D_THREAD_SAFE_ERRNO
|
|
COPT+=-D_AIX -DPOWERPC_AIX -mxl-compat
|
|
LDFLAGS+=-Wl,-lc128,-lc,-lm,-lpthread
|
|
FFI_ENV+=AR_FLAGS="-X32_64 cru"
|
|
STRIP=echo strip -X32_64
|
|
|
|
ifeq ($(ARCH),ppc64)
|
|
COPT+=-maix64
|
|
LDFLAGS+=$(COPT)
|
|
HOST_CONFIG=--host=ppc-aix64
|
|
endif
|
|
ifeq ($(ARCH),ppc)
|
|
COPT+=-maix32
|
|
LDFLAGS+=$(COPT)
|
|
HOST_CONFIG=--host=ppc-aix
|
|
endif
|
|
endif
|
|
|
|
|
|
# Enable 64-bit builds if the arch demands it
|
|
ifeq ($(CC),gcc)
|
|
ifneq ($(OS),aix)
|
|
ifeq ($(ARCH),amd64)
|
|
CC += -m64
|
|
LD += -m64
|
|
endif
|
|
ifeq ($(ARCH),ppc64)
|
|
CC += -m64
|
|
LD += -m64
|
|
endif
|
|
ifeq ($(ARCH),ppc)
|
|
CC += -m32
|
|
LD += -m32
|
|
HOST_CONFIG=--host=ppc-linux
|
|
endif
|
|
ifeq ($(ARCH),i386)
|
|
CC += -m32
|
|
LD += -m32
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
|
|
ifeq ($(OS),darwin)
|
|
XCODE_VERSION=$(shell xcodebuild -version | grep Xcode | sed 's/^Xcode \([1-9]\).*/\1/g')
|
|
JAVA_INCLUDES=-I/System/Library/Frameworks/JavaVM.framework/Headers
|
|
DEFAULT_ARCH=$(shell arch)
|
|
ARCH=$(shell arch)
|
|
HOST_CONFIG=--host $(ARCH)-apple-darwin
|
|
FFI_ENV += CC="$(CC)" CFLAGS="-arch $(ARCH) $(ISYSROOT) $(COPT) $(CDEBUG)" CPPFLAGS="$(CDEFINES)" LD="$(LD) -arch $(ARCH)"
|
|
ALT_ARCHS=
|
|
ifneq ($(ARCH),i386)
|
|
ALT_ARCHS+=i386
|
|
endif
|
|
ifneq ($(ARCH),x86_64)
|
|
ALT_ARCHS+=x86_64
|
|
endif
|
|
ifneq ($(ARCH),ppc)
|
|
ifeq ($(XCODE_VERSION),3)
|
|
# Xcode 3 options
|
|
# not supported on XCode 4+
|
|
ALT_ARCHS+=ppc
|
|
else
|
|
# Xcode 4+ options
|
|
NO_COMPACT_UNWIND=-Wl,-no_compact_unwind
|
|
endif
|
|
endif
|
|
LIBSFX=.dylib
|
|
JNISFX=.jnilib
|
|
ifneq ($(SDKROOT),)
|
|
SYSLIBROOT=-Wl,-syslibroot,$(SDKROOT)
|
|
ISYSROOT=-isysroot $(SDKROOT)
|
|
ARCHFLAGS=-arch i386 -arch x86_64
|
|
ifeq ($(XCODE_VERSION),3)
|
|
ARCHFLAGS+=-arch ppc
|
|
endif
|
|
endif
|
|
|
|
PCFLAGS+=$(ISYSROOT) -x objective-c
|
|
CDEFINES+=-DTARGET_RT_MAC_CFM=0 -DFFI_MMAP_EXEC_WRIT
|
|
LDFLAGS=$(ARCHFLAGS) -dynamiclib -o $@ -framework JavaVM \
|
|
-compatibility_version $(shell echo ${JNA_JNI_VERSION}|sed 's/^\([0-9][0-9]*\).*/\1/g') \
|
|
-current_version $(JNA_JNI_VERSION) \
|
|
-mmacosx-version-min=10.3 \
|
|
-framework Foundation \
|
|
$(NO_COMPACT_UNWIND) \
|
|
-install_name ${@F} \
|
|
$(SYSLIBROOT)
|
|
# JAWT linkage handled by -framework JavaVM
|
|
LIBS=
|
|
endif
|
|
|
|
# Unfortunately, we have to use different libffi include files depending on
|
|
# the target, so we can't do a simple universal build on darwin. Do
|
|
# separate builds, then merge the results.
|
|
$(BUILD)/%.o : %.c dispatch.h protect.h $(FFI_LIB)
|
|
@mkdir -p $(BUILD)
|
|
ifneq ($(SDKROOT),)
|
|
$(CC) -arch $(ARCH) $(CFLAGS) -c $< -o $@.$(ARCH)
|
|
for arch in $(ALT_ARCHS); do \
|
|
$(CC) -arch $$arch -I$(BUILD)/libffi.$$arch/include $(CFLAGS) -c $< -o $@.$$arch; \
|
|
done
|
|
lipo -create -output $@ $@.*
|
|
else
|
|
$(CC) $(CFLAGS) -c $< $(COUT)
|
|
endif
|
|
|
|
all: $(LIBRARY) $(TESTLIB) $(TESTLIB2) $(TESTLIB_JAR) $(TESTLIB_PATH) $(TESTLIB_TRUNC)
|
|
|
|
install:
|
|
mkdir $(INSTALLDIR)
|
|
cp $(LIBRARY) $(INSTALLDIR)
|
|
|
|
$(DLLCB): dll-callback.c
|
|
$(MINGW) -DDEFINE_CALLBACKS -c $< $(COUT)
|
|
|
|
$(RSRC): $(BUILD)/jnidispatch.rc $(BUILD)/$(JNA_JNI_VERSION).stamp
|
|
$(WINDRES) -i $< -o $@ \
|
|
|| (echo > $@.c && $(CC) $(CFLAGS) -c $@.c $(COUT))
|
|
|
|
$(BUILD)/$(JNA_JNI_VERSION).stamp:
|
|
@touch $@
|
|
|
|
$(LIBRARY): $(JNIDISPATCH_OBJS) $(FFI_LIB)
|
|
$(LD) $(LDFLAGS) $(JNIDISPATCH_OBJS) $(FFI_LIB) $(LIBS)
|
|
$(STRIP) $@
|
|
|
|
$(TESTLIB): $(BUILD)/testlib.o
|
|
$(LD) $(LDFLAGS) $< $(LIBS)
|
|
|
|
# These targets provide for different shared library loading methods
|
|
# without getting into native library load conflicts
|
|
$(TESTLIB_JAR) $(TESTLIB_PATH) $(TESTLIB_TRUNC): $(TESTLIB)
|
|
@cp $< $@
|
|
|
|
ifeq ($(ARSFX),.lib)
|
|
TESTDEP=$(TESTLIB:.dll=.lib)
|
|
else
|
|
TESTDEP=$(TESTLIB)
|
|
endif
|
|
$(TESTLIB2): $(BUILD)/testlib2.o
|
|
$(LD) $(LDFLAGS) $< $(TESTDEP) $(LIBS)
|
|
|
|
ifneq ($(DYNAMIC_LIBFFI),true)
|
|
$(FFI_LIB):
|
|
@mkdir -p $(FFI_BUILD)
|
|
@if [ ! -f $(FFI_BUILD)/Makefile ]; then \
|
|
echo "Configuring libffi ($(ARCH))"; \
|
|
(cd $(FFI_BUILD) \
|
|
&& $(FFI_ENV) $(FFI_SRC)/configure $(FFI_CONFIG) $(HOST_CONFIG)); \
|
|
fi
|
|
$(MAKE) -C $(FFI_BUILD)
|
|
ifneq ($(SDKROOT),)
|
|
@for arch in $(ALT_ARCHS); do \
|
|
mkdir -p $(BUILD)/libffi.$$arch; \
|
|
if [ ! -f $(BUILD)/libffi.$$arch/Makefile ]; then \
|
|
echo "Configuring libffi ($$arch)"; \
|
|
(cd $(BUILD)/libffi.$$arch \
|
|
&& CC="$(CC)" CFLAGS="-arch $$arch $(ISYSROOT) $(COPT) $(CDEBUG)" CPPFLAGS="$(CDEFINES)" \
|
|
LDFLAGS="-arch $$arch" \
|
|
$(FFI_SRC)/configure $(FFI_CONFIG) --host=$$arch-apple-darwin --disable-dependency-tracking); \
|
|
fi; \
|
|
$(MAKE) -C $(BUILD)/libffi.$$arch; \
|
|
done
|
|
ifneq ($(ALT_ARCHS),)
|
|
/usr/bin/libtool -static -o $@.tmp $(FFI_BUILD)/.libs/${@F} $(BUILD)/libffi.*/.libs/${@F}
|
|
else
|
|
/usr/bin/libtool -static -o $@.tmp $(FFI_BUILD)/.libs/${@F}
|
|
endif
|
|
mv $@.tmp $@
|
|
endif
|
|
endif
|
|
|
|
clean:
|
|
$(RM) -rf $(BUILD)
|
|
|
|
version:
|
|
@echo version=$(JNA_JNI_VERSION)
|
|
|
|
#EOF
|