
2 changed files with 162 additions and 0 deletions
@ -0,0 +1,27 @@ |
|||||
|
LIBRARY=libpEpJNI.a |
||||
|
JAR=jniadapter.jar |
||||
|
|
||||
|
all: $(JAR) $(LIBRARY) |
||||
|
|
||||
|
JAVASOURCE=$(wildcard org/pEp/jniadapter/*.java) |
||||
|
|
||||
|
$(JAR): $(JAVASOURCE) |
||||
|
javac $< |
||||
|
jar cf $@ org/pEp/jniadapter/*.class |
||||
|
|
||||
|
org_pEp_jniadapter_Engine.h: org/pEp/jniadapter/Engine.java |
||||
|
javah org.pEp.jniadapter.Engine |
||||
|
|
||||
|
org_pEp_jniadapter_Engine.o: org_pEp_jniadapter_Engine.h org_pEp_jniadapter_Engine.cc |
||||
|
|
||||
|
$(LIBRARY): org_pEp_jniadapter_Engine.o |
||||
|
ar -r $@ $< |
||||
|
|
||||
|
.PHONY: clean |
||||
|
|
||||
|
clean: |
||||
|
rm -f $(JAR) $(LIBRARY) |
||||
|
rm -f org_pEp_jniadapter_Engine.o |
||||
|
rm -f org_pEp_jniadapter_Engine.h |
||||
|
rm -f org/pEp/jniadapter/*.class |
||||
|
|
@ -0,0 +1,135 @@ |
|||||
|
#include "org_pEp_jniadapter_Engine.h" |
||||
|
|
||||
|
#include <stdexcept> |
||||
|
#include <typeinfo> |
||||
|
#include <assert.h> |
||||
|
#include <pEp/pEpEngine.h> |
||||
|
|
||||
|
namespace pEp { |
||||
|
namespace JNIAdapter { |
||||
|
jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status) |
||||
|
{ |
||||
|
jclass ex; |
||||
|
const char *ex_name; |
||||
|
|
||||
|
switch (status) { |
||||
|
case PEP_INIT_CANNOT_LOAD_GPGME: |
||||
|
ex_name = "org/pEp/jniadapter/InitCannotLoadGPGME"; |
||||
|
break; |
||||
|
case PEP_INIT_GPGME_INIT_FAILED: |
||||
|
ex_name = "org/pEp/jniadapter/GPGMEInitFailed"; |
||||
|
break; |
||||
|
case PEP_INIT_SQLITE3_WITHOUT_MUTEX: |
||||
|
ex_name = "org/pEp/jniadapter/SQLite3WithoutMutex"; |
||||
|
break; |
||||
|
case PEP_INIT_CANNOT_OPEN_DB: |
||||
|
ex_name = "org/pEp/jniadapter/InitCannotOpenDB"; |
||||
|
break; |
||||
|
case PEP_INIT_CANNOT_OPEN_SYSTEM_DB: |
||||
|
ex_name = "org/pEp/jniadapter/InitCannotOpenSystemDB"; |
||||
|
break; |
||||
|
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); |
||||
|
} |
||||
|
|
||||
|
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; |
||||
|
} |
||||
|
}; |
||||
|
}; |
||||
|
|
||||
|
extern "C" { |
||||
|
using namespace pEp::JNIAdapter; |
||||
|
|
||||
|
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_init( |
||||
|
JNIEnv *env, |
||||
|
jobject me |
||||
|
) |
||||
|
{ |
||||
|
PEP_SESSION session = NULL; |
||||
|
jfieldID handle; |
||||
|
|
||||
|
PEP_STATUS status = init(&session); |
||||
|
assert(status == PEP_STATUS_OK); |
||||
|
|
||||
|
if (status != PEP_STATUS_OK) { |
||||
|
throw_pEp_Exception(env, status); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
assert(session); |
||||
|
|
||||
|
try { |
||||
|
handle = getFieldID(env, "org/pEp/jniadapter/Engine", "handle", "J"); |
||||
|
} |
||||
|
catch (std::exception& ex) { |
||||
|
assert(0); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
jlong _session = (jlong) session; |
||||
|
env->SetLongField(me, handle, _session); |
||||
|
} |
||||
|
|
||||
|
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_release( |
||||
|
JNIEnv *env, |
||||
|
jobject me |
||||
|
) |
||||
|
{ |
||||
|
PEP_SESSION session = NULL; |
||||
|
jfieldID handle; |
||||
|
|
||||
|
try { |
||||
|
handle = getFieldID(env, "org/pEp/jniadapter/Engine", "handle", "J"); |
||||
|
} |
||||
|
catch (std::exception& ex) { |
||||
|
assert(0); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
session = (PEP_SESSION) env->GetLongField(me, handle); |
||||
|
if (session) |
||||
|
release(session); |
||||
|
else |
||||
|
env->SetLongField(me, handle, jlong(0)); |
||||
|
} |
||||
|
} |
||||
|
|
Loading…
Reference in new issue