[PATCH/RFC V2 00/26] JNI bindings for libopenconnect
Kevin Cernekee
cernekee at gmail.com
Sun Aug 11 21:49:01 EDT 2013
Here is the second iteration of my JNI/Android patch series.
This has grown into a relatively large set of changes so I put
together a quick proof of concept based on an existing Android OpenVPN
client, to prove to myself that the new interfaces are suitable for the
task at hand:
https://github.com/cernekee/ics-openvpn/commits/oc-v1
https://dl.dropboxusercontent.com/u/169702767/icsvpn/screenshot-log.png
https://dl.dropboxusercontent.com/u/169702767/icsvpn/screenshot-notif.png
https://dl.dropboxusercontent.com/u/169702767/icsvpn/icsopenvpn.apk
V1->V2 changes:
Split JNI wrappers into a separate shared library by default, but
still allow building a monolithic library for Android
Don't require JAVAC to be set if javac can be found via JAVA_HOME or
PATH
Rename org.infradead.openconnect.LibOpenConnect to
org.infradead.libopenconnect.LibOpenConnect, so the library code is
guaranteed to have its own package
Move the Java code under java/, and use ant to build it
Add connection initiation and mainloop support to C and Java libraries
Modify main.c to take advantage of the new library APIs
Get rid of forward declarations in jni.c by overriding
-Wmissing-declarations
Add or enhance Java library functions:
- cancel() / isCanceled(), to make it easier for callers to shut down
after user aborts
- setLogLevel(), to avoid calling back into Java on every single
packet (PRG_TRACE message)
- parseURL() - convert to use helper macros
- all: use JNI global references to clean up the PUSH_CTX/POP_CTX
hacks
- Removed a bunch of helper functions in favor of direct object field
access from C
These patches are posted at: git://github.com/cernekee/openconnect jni-v2
Possible trouble spots:
I'm using explicit routes at the moment so I don't see problems on this
setup, but I think we need to be able to call VpnService.protect() on
the sockets used for SSL and DTLS connections. This may require another
library->JNI->Java callback to handle cases like reconnect.
It would be nice to have a way to obtain byte counts from the library.
Maybe through a periodic mainloop callback that runs every second or
so?
Can somebody check to see if strsignal() works on Solaris?
The openconnect.pc.in changes are untested and should be scrutinized.
This patch series has gone through quite a bit of churn so there are
probably at least a few bugs remaining.
I still haven't looked for memory leaks in the JNI code.
Kevin Cernekee (26):
library: Remove declaration for nonexistent
openconnect_get_vpn_name()
auth: Hack around const warnings
Introduce new helper functions for cancel_fd checking
library: Add new openconnect_setup_cancel_pipe() call
Convert vpn_mainloop() into a library function
main: Introduce xstrdup() function
tun: Export setup_tun() functionality
Move vpninfo default settings into library
library: Check for failed allocations in openconnect_vpninfo_new()
dtls: Export setup_dtls() function
cstp: Export make_cstp_connection()
library: Move the mainloop guts into libopenconnect
library: Update openconnect.pc.in
tun, cstp: Don't exit() on failure
library: Free zlib state
cstp: Clean up split include/exclude/DNS lists when freeing vpninfo
library: Add get/set functions for servercert, ifname, reqmtu
library: Export VPN IP information to callers
main: Add openconnect_vpninfo_free() on a couple of exit paths
buildsys: Allow overriding -W flags
acinclude: Add AX_JNI_INCLUDE_DIR macro
JNI: Initial commit of C wrapper functions
JNI: Initial commit of Java library + example program
android: Enable JNI in build
android: Add libstoken to build
library: Update changelog and bump minor version
.gitignore | 1 +
Makefile.am | 25 +-
acinclude.m4 | 125 +++
android/0001-Remove-call-to-mlockall.patch | 33 +
android/Makefile | 72 +-
auth.c | 8 +-
configure.ac | 48 +-
cstp.c | 135 +--
dtls.c | 14 +-
gnutls.c | 36 +-
http.c | 18 +-
java/.gitignore | 2 +
java/README | 22 +
java/build.xml | 33 +
java/src/com/example/LibTest.java | 201 +++++
.../infradead/libopenconnect/LibOpenConnect.java | 231 +++++
jni.c | 926 ++++++++++++++++++++
libopenconnect.map.in | 16 +
library.c | 77 +-
main.c | 137 ++-
mainloop.c | 28 +-
openconnect-internal.h | 66 +-
openconnect.h | 61 +-
openconnect.pc.in | 2 +-
openssl.c | 36 +-
ssl.c | 8 +-
tun.c | 185 ++--
27 files changed, 2192 insertions(+), 354 deletions(-)
create mode 100644 android/0001-Remove-call-to-mlockall.patch
create mode 100644 java/.gitignore
create mode 100644 java/README
create mode 100644 java/build.xml
create mode 100644 java/src/com/example/LibTest.java
create mode 100644 java/src/org/infradead/libopenconnect/LibOpenConnect.java
create mode 100644 jni.c
--
1.7.9.5
More information about the openconnect-devel
mailing list