From 6d616ce2c37af2087ddc2bdb2f112f0abe3679b8 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Sun, 5 Apr 2015 23:15:32 +0200 Subject: [PATCH] ... --- src/Makefile | 20 +++--- src/gen_java_exceptions.ysl2 | 2 +- src/gen_throw_pEp_exception.ysl2 | 64 +++++++++++++++++++ src/jniutils.cc | 40 ++++++++++++ src/jniutils.hh | 15 +++++ src/org/pEp/jniadapter/AbstractEngine.java | 22 +++++++ src/org/pEp/jniadapter/Engine.java | 16 +---- ...c => org_pEp_jniadapter_AbstractEngine.cc} | 38 +---------- src/textutils.ysl2 | 32 ++++++++++ 9 files changed, 186 insertions(+), 63 deletions(-) create mode 100644 src/gen_throw_pEp_exception.ysl2 create mode 100644 src/jniutils.cc create mode 100644 src/jniutils.hh create mode 100644 src/org/pEp/jniadapter/AbstractEngine.java rename src/{org_pEp_jniadapter_Engine.cc => org_pEp_jniadapter_AbstractEngine.cc} (58%) create mode 100644 src/textutils.ysl2 diff --git a/src/Makefile b/src/Makefile index 0bed908..4334309 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,27 +3,25 @@ JAR=jniadapter.jar all: $(JAR) $(LIBRARY) -JAVASOURCE=$(wildcard org/pEp/jniadapter/*.java) org/pEp/jniadapter/pEpException.java - -$(JAR): $(JAVASOURCE) - javac $< +$(JAR): org/pEp/jniadapter/pEpException.java + javac org/pEp/jniadapter/*.java jar cf $@ org/pEp/jniadapter/*.class -org_pEp_jniadapter_Engine.h: org/pEp/jniadapter/Engine.java - javah org.pEp.jniadapter.Engine +org_pEp_jniadapter_AbstractEngine.h: org/pEp/jniadapter/Engine.java + javah org.pEp.jniadapter.AbstractEngine -org_pEp_jniadapter_Engine.o: org_pEp_jniadapter_Engine.h org_pEp_jniadapter_Engine.cc throw_pEp_exception.hh +org_pEp_jniadapter_AbstractEngine.o: org_pEp_jniadapter_AbstractEngine.h org_pEp_jniadapter_AbstractEngine.cc throw_pEp_exception.hh jniutils.hh -$(LIBRARY): org_pEp_jniadapter_Engine.o throw_pEp_exception.o - ar -r $@ $< +$(LIBRARY): org_pEp_jniadapter_AbstractEngine.o throw_pEp_exception.o jniutils.o + ar -r $@ *.o .PHONY: clean generate distclean clean: rm -f $(JAR) $(LIBRARY) - rm -f org_pEp_jniadapter_Engine.o - rm -f org_pEp_jniadapter_Engine.h + rm -f *.o rm -f *.class + rm -f org_pEp_jniadapter_*.h rm -f org/pEp/jniadapter/*.class rm -f org/pEp/jniadapter/pEp*.java rm -f throw_pEp_exception.* diff --git a/src/gen_java_exceptions.ysl2 b/src/gen_java_exceptions.ysl2 index 7420ec5..d249115 100644 --- a/src/gen_java_exceptions.ysl2 +++ b/src/gen_java_exceptions.ysl2 @@ -14,7 +14,7 @@ tstylesheet { function "exception" { param "name"; - document("org/pEp/jniadapter/{$name}.java") { + document "org/pEp/jniadapter/{$name}.java", "text" { | package org.pEp.jniadapter; | | class «$name» extends pEpException { } diff --git a/src/gen_throw_pEp_exception.ysl2 b/src/gen_throw_pEp_exception.ysl2 new file mode 100644 index 0000000..25b38ee --- /dev/null +++ b/src/gen_throw_pEp_exception.ysl2 @@ -0,0 +1,64 @@ +include yslt.yml2 + +tstylesheet { + include ./textutils.ysl2 + + template "/" { + apply "namespace", 0; + document "throw_pEp_exception.hh", "text" + || + #pragma once + + #include + + namespace pEp { + namespace JNIAdapter { + jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status); + }; + }; + + || + + } + + template "namespace" + || + #include + #include + #include "throw_pEp_exception.hh" + + namespace pEp { + namespace JNIAdapter { + jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status) + { + jclass ex; + const char *ex_name; + + switch (status) { + `` apply "enum/*", 4, mode=case + default: + assert(0); + ex_name = "Exception"; + } + + ex = env->FindClass(ex_name); + assert(ex); + + if (ex == NULL) { + ex = env->FindClass("java/lang/NoClassDefFoundError"); + assert(ex); + } + + return env->ThrowNew(ex, ex_name); + } + }; + }; + || + + template "*", mode=case { + | case `call "UCASE" with "text", "name(.)"`: + | ex_name = "org/pEp/jniadapter/`call "CamelCase" with "text", "name(.)"`"; + | break; + } +} + diff --git a/src/jniutils.cc b/src/jniutils.cc new file mode 100644 index 0000000..e550a6a --- /dev/null +++ b/src/jniutils.cc @@ -0,0 +1,40 @@ +#include "jniutils.hh" + +#include +#include +#include + +namespace pEp { + namespace JNIAdapter { + jfieldID getFieldID( + JNIEnv *env, + const char *classname, + const char *fieldname, + const char *signature + ) + { + jclass engine = env->FindClass(classname); + assert(engine); + + if (engine == NULL) { + jclass ex = env->FindClass("java/lang/NoClassDefFoundError"); + assert(ex); + env->ThrowNew(ex, classname); + throw std::bad_cast(); + } + + jfieldID field = env->GetFieldID(engine, fieldname, signature); + assert(field); + + if (field == NULL) { + jclass ex = env->FindClass("java/lang/NoSuchFieldError"); + assert(ex); + env->ThrowNew(ex, fieldname); + throw std::invalid_argument(fieldname); + } + + return field; + } + }; +}; + diff --git a/src/jniutils.hh b/src/jniutils.hh new file mode 100644 index 0000000..34de343 --- /dev/null +++ b/src/jniutils.hh @@ -0,0 +1,15 @@ +#pragma once + +#include + +namespace pEp { + namespace JNIAdapter { + jfieldID getFieldID( + JNIEnv *env, + const char *classname, + const char *fieldname, + const char *signature + ); + }; +}; + diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java new file mode 100644 index 0000000..90d52f9 --- /dev/null +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -0,0 +1,22 @@ +package org.pEp.jniadapter; + +abstract class AbstractEngine implements AutoCloseable { + static { + System.loadLibrary("pEpJNI"); + } + + protected native void init() throws pEpException; + protected native void release(); + + private long handle; + protected long getHandle() { return handle; } + + public AbstractEngine() throws pEpException { + init(); + } + + public void close() { + release(); + } +} + diff --git a/src/org/pEp/jniadapter/Engine.java b/src/org/pEp/jniadapter/Engine.java index fbc5002..45ed16a 100644 --- a/src/org/pEp/jniadapter/Engine.java +++ b/src/org/pEp/jniadapter/Engine.java @@ -1,21 +1,7 @@ package org.pEp.jniadapter; -public class Engine implements AutoCloseable { - static { - System.loadLibrary("pEpJNI"); - } - - protected native void init() throws pEpException; - protected native void release(); - - private long handle; - +public class Engine extends AbstractEngine { public Engine() throws pEpException { - init(); - } - - public void close() { - release(); } } diff --git a/src/org_pEp_jniadapter_Engine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc similarity index 58% rename from src/org_pEp_jniadapter_Engine.cc rename to src/org_pEp_jniadapter_AbstractEngine.cc index d73a71d..26cdf16 100644 --- a/src/org_pEp_jniadapter_Engine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -1,45 +1,11 @@ -#include "org_pEp_jniadapter_Engine.h" +#include "org_pEp_jniadapter_AbstractEngine.h" #include -#include #include #include #include "throw_pEp_exception.hh" - -namespace pEp { - namespace JNIAdapter { - jfieldID getFieldID( - JNIEnv *env, - const char *classname, - const char *fieldname, - const char *signature - ) - { - jclass engine = env->FindClass(classname); - assert(engine); - - if (engine == NULL) { - jclass ex = env->FindClass("java/lang/NoClassDefFoundError"); - assert(ex); - env->ThrowNew(ex, classname); - throw std::bad_cast(); - } - - jfieldID field = env->GetFieldID(engine, fieldname, signature); - assert(field); - - if (field == NULL) { - jclass ex = env->FindClass("java/lang/NoSuchFieldError"); - assert(ex); - env->ThrowNew(ex, fieldname); - throw std::invalid_argument(fieldname); - } - - return field; - } - }; -}; +#include "jniutils.hh" extern "C" { using namespace pEp::JNIAdapter; diff --git a/src/textutils.ysl2 b/src/textutils.ysl2 new file mode 100644 index 0000000..567f48e --- /dev/null +++ b/src/textutils.ysl2 @@ -0,0 +1,32 @@ +function "UCASE" { + param "text"; + + value "translate($text, 'abcdefghijklmnopqrstuvwxyz-', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_')"; +} + +function "lcase" { + param "text"; + + value "translate($text, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-', 'abcdefghijklmnopqrstuvwxyz_')"; +} + +function "CamelCase" { + param "text"; + + choose { + when "contains($text, '-')" { + const "tokens", "str:tokenize($text, '-')"; + for "$tokens" { + choose { + when ".='pEp'" > pEp + otherwise { + call "UCASE" with "text", "substring(., 1, 1)"; + call "lcase" with "text", "substring(., 2)"; + } + } + } + } + otherwise | unsupported + } +} +