diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
new file mode 100644
index 0000000..39a87d9
--- /dev/null
+++ b/android/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..41653ad
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,109 @@
+// Android pEp JNI adapter Aar gradle build script
+
+import org.apache.tools.ant.taskdefs.condition.Os
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.1.0'
+ }
+}
+
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 21
+ buildToolsVersion "21.1.2"
+
+ defaultConfig {
+ minSdkVersion 15
+ targetSdkVersion 21
+ versionCode 1
+ versionName "1.0"
+ }
+
+ sourceSets {
+ main {
+
+ manifest.srcFile 'AndroidManifest.xml'
+
+ // where to find generated Java source
+ java.srcDirs = ['../src']
+
+ // disable automatic ndk-build call, which ignore our Android.mk
+ jni.srcDirs = []
+ jniLibs.srcDir 'src/main/libs'
+
+ }
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ // call source generation makefile target
+ task genSources(type:Exec) {
+ workingDir '../src'
+ commandLine 'make', 'gensource'
+ }
+
+ // unzip some of the dependencies
+ task unzipDeps(type: Copy) {
+ from zipTree(file('../../pEpEngine/android/pEpEngine-android-1.zip'))
+ from zipTree(file('../../libetpan/build-android/libetpan-android-1.zip'))
+ from zipTree(file('../../libetpan/build-android/dependencies/openssl/openssl-android-1.zip'))
+ from zipTree(file('../../libetpan/build-android/dependencies/cyrus-sasl/cyrus-sasl-android-1.zip'))
+ into file("${buildDir}")
+ }
+
+ // call regular ndk-build(.cmd) script from app directory
+ task jniBuild(type: Exec) {
+ commandLine getNdkBuildCmd(), 'V=1'
+ }
+ jniBuild.dependsOn genSources
+ jniBuild.dependsOn unzipDeps
+
+ // Ensure this is done before java build
+ tasks.withType(JavaCompile) {
+ compileTask -> compileTask.dependsOn jniBuild
+ }
+
+ task cleanNative(type: Exec) {
+ commandLine getNdkBuildCmd(), 'clean'
+ }
+
+ clean.dependsOn cleanNative
+
+}
+
+def getNdkDir() {
+ if (System.env.ANDROID_NDK_ROOT != null)
+ return System.env.ANDROID_NDK_ROOT
+
+ Properties properties = new Properties()
+ properties.load(project.rootProject.file('local.properties').newDataInputStream())
+ def ndkdir = properties.getProperty('ndk.dir', null)
+ if (ndkdir == null)
+ throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.")
+
+ return ndkdir
+}
+
+def getNdkBuildCmd() {
+ def ndkbuild = getNdkDir() + "/ndk-build"
+ if (Os.isFamily(Os.FAMILY_WINDOWS))
+ ndkbuild += ".cmd"
+
+ return ndkbuild
+}
+
+
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
new file mode 100644
index 0000000..0158d4c
--- /dev/null
+++ b/android/jni/Android.mk
@@ -0,0 +1,86 @@
+LOCAL_PATH:= $(call my-dir)
+
+GPGEXT := ../../../gnupg-for-android/external
+GPGROOT := data/data/info.guardianproject.gpg/app_opt
+GPGBUILD := $(GPGEXT)/$(GPGROOT)
+
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libassuan
+LOCAL_SRC_FILES := $(GPGBUILD)/lib/libassuan.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libcurl
+LOCAL_SRC_FILES := $(GPGBUILD)/lib/libcurl.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libgcrypt
+LOCAL_SRC_FILES := $(GPGBUILD)/lib/libgcrypt.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libgpg-error
+LOCAL_SRC_FILES := $(GPGBUILD)/lib/libgpg-error.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libgpgme
+LOCAL_SRC_FILES := $(GPGBUILD)/lib/libgpgme.so
+LOCAL_EXPORT_C_INCLUDES := $(GPGEXT)/$(GPGROOT)/include $(GPGEXT)/gpgme/src
+include $(PREBUILT_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libksba
+LOCAL_SRC_FILES := $(GPGBUILD)/lib/libksba.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libnpth
+LOCAL_SRC_FILES := $(GPGBUILD)/lib/libnpth.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := openssl
+LOCAL_SRC_FILES := ../build/openssl-android-1/libs/$(TARGET_ARCH_ABI)/libcrypto.a
+#\
+# ../build/openssl-android-1/libs/$(TARGET_ARCH_ABI)/libssl.a
+LOCAL_EXPORT_C_INCLUDES := build/openssl-android-1/include
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := cyrus-sasl
+LOCAL_SRC_FILES := ../build/cyrus-sasl-android-1/libs/$(TARGET_ARCH_ABI)/libsasl2.a
+LOCAL_EXPORT_C_INCLUDES := build/cyrus-sasl-android-1/include
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libetpan
+LOCAL_SRC_FILES := ../build/libetpan-android-1/libs/$(TARGET_ARCH_ABI)/libetpan.a
+LOCAL_EXPORT_C_INCLUDES := build/libetpan-android-1/include
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := pEpEngine
+LOCAL_SRC_FILES := ../build/pEpEngine-android-1/libs/$(TARGET_ARCH_ABI)/libpEpEngine.a
+LOCAL_EXPORT_C_INCLUDES := build/pEpEngine-android-1/include
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := pEpJNIAdapter
+LOCAL_SHARED_LIBRARIES := libgpgme
+LOCAL_STATIC_LIBRARIES := openssl cyrus-sasl libetpan pEpEngine
+LOCAL_CPP_FEATURES += exceptions
+LOCAL_SRC_FILES := \
+ ../../src/org_pEp_jniadapter_Engine.cc \
+ ../../src/org_pEp_jniadapter_Message.cc \
+ ../../src/throw_pEp_exception.cc \
+ ../../src/jniutils.cc
+
+LOCAL_C_INCLUDES := ../src
+
+
+include $(BUILD_SHARED_LIBRARY)
+
+
diff --git a/android/jni/Application.mk b/android/jni/Application.mk
new file mode 100644
index 0000000..caf3b26
--- /dev/null
+++ b/android/jni/Application.mk
@@ -0,0 +1 @@
+APP_STL := stlport_static
diff --git a/android/local.properties b/android/local.properties
new file mode 100644
index 0000000..99084e9
--- /dev/null
+++ b/android/local.properties
@@ -0,0 +1,8 @@
+## This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+#
+# Location of the SDK. This is only used by Gradle.
+#
+#Wed Apr 15 10:58:28 EDT 2015
+sdk.dir=/home/pepdev/Android/Sdk
+ndk.dir=/home/pepdev/Android/android-ndk-r10d
diff --git a/src/Makefile b/src/Makefile
index d4f4587..a18a33b 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,11 +1,25 @@
LIBRARY=libpEpJNI.a
JAR=jniadapter.jar
-
include Makefile.conf
all: $(JAR) $(LIBRARY)
-$(JAR): org/pEp/jniadapter/pEpException.java org/pEp/jniadapter/AbstractEngine.java org/pEp/jniadapter/Message.java org/pEp/jniadapter/Engine.java
+JAVA_SOURCES=org/pEp/jniadapter/pEpException.java \
+ org/pEp/jniadapter/AbstractEngine.java \
+ org/pEp/jniadapter/Message.java \
+ org/pEp/jniadapter/Engine.java
+
+C_SOURCES=org_pEp_jniadapter_Engine.cc \
+ org_pEp_jniadapter_Engine.h \
+ org_pEp_jniadapter_Message.cc \
+ org_pEp_jniadapter_Message.h \
+ throw_pEp_exception.cc \
+ throw_pEp_exception.hh \
+ org_pEp_jniadapter_AbstractEngine.h
+
+gensource: $(JAVA_SOURCES) $(C_SOURCES)
+
+$(JAR): $(JAVA_SOURCES)
javac org/pEp/jniadapter/*.java
jar cf $@ org/pEp/jniadapter/*.class
diff --git a/src/Makefile.conf b/src/Makefile.conf
index c235ca1..2c3aeb0 100644
--- a/src/Makefile.conf
+++ b/src/Makefile.conf
@@ -1,3 +1,3 @@
-JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home
-CXXFLAGS=-I$(JAVA_HOME)/include -I/opt/local/include -I$(JAVA_HOME)/include/darwin -I$(HOME)/include
-CLASSPATH=.:$(HOME)/k-9/src
+JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
+CXXFLAGS=-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I$(HOME)/include
+CLASSPATH=.:$(HOME)/src/k-9/k9mail/src
diff --git a/src/jniutils.cc b/src/jniutils.cc
index e550a6a..fda43df 100644
--- a/src/jniutils.cc
+++ b/src/jniutils.cc
@@ -3,6 +3,7 @@
#include
#include
#include
+#include
namespace pEp {
namespace JNIAdapter {
@@ -30,7 +31,7 @@ namespace pEp {
jclass ex = env->FindClass("java/lang/NoSuchFieldError");
assert(ex);
env->ThrowNew(ex, fieldname);
- throw std::invalid_argument(fieldname);
+ throw std::invalid_argument(std::string(fieldname));
}
return field;
diff --git a/src/types_c.ysl2 b/src/types_c.ysl2
index 8e49f45..585f31f 100644
--- a/src/types_c.ysl2
+++ b/src/types_c.ysl2
@@ -12,7 +12,7 @@ function "toC" {
when "$type='EncFormat'" > PEP_enc_format
when "$type='bloblist'" > bloblist_t
when "$type='stringpairlist'" > stringpair_list_t
- when "$type='direction'" > PEP_direction
+ when "$type='direction'" > PEP_msg_direction
otherwise value "$type";
}