From bae05df3b040c56f87d331a3f7b58529b1e8a014 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Tue, 28 May 2013 13:32:32 +0000 Subject: [PATCH] added a test class for the Java API plus a small refinement in the implementation for the binding --- src/runtime/java/Test.java | 8 +++++ src/runtime/java/jpgf.c | 21 ++++++++---- .../java/org/grammaticalframework/PGF.java | 32 +++++++++++-------- 3 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 src/runtime/java/Test.java diff --git a/src/runtime/java/Test.java b/src/runtime/java/Test.java new file mode 100644 index 000000000..c58a90c77 --- /dev/null +++ b/src/runtime/java/Test.java @@ -0,0 +1,8 @@ +import org.grammaticalframework.*; + +public class Test { + public static void main(String[] args) { + PGF gr = PGF.readPGF("/home/krasimir/www.grammaticalframework.org/treebanks/PennTreebank/ParseEngAbs.pgf"); + gr.close(); + } +} diff --git a/src/runtime/java/jpgf.c b/src/runtime/java/jpgf.c index 4796e32dd..44b72d269 100644 --- a/src/runtime/java/jpgf.c +++ b/src/runtime/java/jpgf.c @@ -4,17 +4,20 @@ JNIEXPORT jobject JNICALL Java_org_grammaticalframework_PGF_readPGF(JNIEnv *env, jclass cls, jstring s) -{ - const char *fpath = (*env)->GetStringUTFChars(env, s, 0); - +{ GuPool* pool = gu_new_pool(); GuPool* tmp_pool = gu_local_pool(); // Create an exception frame that catches all errors. GuExn* err = gu_new_exn(NULL, gu_kind(type), tmp_pool); + const char *fpath = (*env)->GetStringUTFChars(env, s, 0); + // Read the PGF grammar. PgfPGF* pgf = pgf_read(fpath, pool, err); + + (*env)->ReleaseStringUTFChars(env, s, fpath); + if (!gu_ok(err)) { gu_pool_free(pool); gu_pool_free(tmp_pool); @@ -23,9 +26,13 @@ Java_org_grammaticalframework_PGF_readPGF(JNIEnv *env, jclass cls, jstring s) gu_pool_free(tmp_pool); - (*env)->ReleaseStringUTFChars(env, s, fpath); + jmethodID constrId = (*env)->GetMethodID(env, cls, "", "(JJ)V"); - jmethodID constrId = (*env)->GetMethodID(env, cls, "", "(II)V"); - - return (*env)->NewObject(env, cls, constrId, (int) pool, (int) pgf); + return (*env)->NewObject(env, cls, constrId, (long) pool, (long) pgf); +} + +JNIEXPORT void JNICALL +Java_org_grammaticalframework_PGF_free(JNIEnv* env, jclass cls, jlong pool) +{ + gu_pool_free((GuPool*) pool); } diff --git a/src/runtime/java/org/grammaticalframework/PGF.java b/src/runtime/java/org/grammaticalframework/PGF.java index 777edbd98..6ff0a21a4 100644 --- a/src/runtime/java/org/grammaticalframework/PGF.java +++ b/src/runtime/java/org/grammaticalframework/PGF.java @@ -1,25 +1,31 @@ package org.grammaticalframework; public class PGF { - static native PGF readPGF(String path); - - private int pool; - private int gr; + public static native PGF readPGF(String path); - private PGF(int pool, int gr) { + public void close() { + if (pool != 0) { + free(pool); + pool = 0; + gr = 0; + } + } + + private static native void free(long pool); + + private long pool; + private long gr; + + private PGF(long pool, long gr) { this.pool = pool; this.gr = gr; } + protected void finalize () throws Throwable { + close(); + } + static { System.loadLibrary("jpgf"); } - - public void test() { - System.out.println("pool="+pool+", gr="+gr); - } - - public static void main(String[] args) { - readPGF("/home/krasimir/www.grammaticalframework.org/treebanks/PennTreebank/ParseEngAbs.pgf").test(); - } }