From 6692732715c46bb2fb29d9847f977ee85331cc17 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sat, 2 Mar 2024 11:18:32 +0100 Subject: [PATCH] Implement the AutoCloseable interface --- App.java | 7 +++++++ org/libdivecomputer/Context.java | 8 ++++++++ org/libdivecomputer/Descriptor.java | 8 ++++++++ org/libdivecomputer/Device.java | 8 ++++++++ org/libdivecomputer/Handle.java | 2 +- org/libdivecomputer/IOStream.java | 12 ++++++++++++ org/libdivecomputer/Parser.java | 8 ++++++++ org_libdivecomputer_Context.c | 6 ++++++ org_libdivecomputer_Context.h | 8 ++++++++ org_libdivecomputer_Descriptor.c | 6 ++++++ org_libdivecomputer_Descriptor.h | 8 ++++++++ org_libdivecomputer_Device.c | 6 ++++++ org_libdivecomputer_Device.h | 8 ++++++++ org_libdivecomputer_IOStream.c | 9 +++++++++ org_libdivecomputer_IOStream.h | 21 +++++++++++++++++++++ org_libdivecomputer_Parser.c | 6 ++++++ org_libdivecomputer_Parser.h | 8 ++++++++ 17 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 org_libdivecomputer_IOStream.c create mode 100644 org_libdivecomputer_IOStream.h diff --git a/App.java b/App.java index fa1cc7d..be336af 100644 --- a/App.java +++ b/App.java @@ -194,9 +194,16 @@ public void Gasmix(int value) { } }); + parser.close(); + // Continue downloading dives. return 1; } }); + + device.close(); + iostream.close(); + descriptor.close(); + context.close(); } } diff --git a/org/libdivecomputer/Context.java b/org/libdivecomputer/Context.java index 27bcdba..92168ad 100644 --- a/org/libdivecomputer/Context.java +++ b/org/libdivecomputer/Context.java @@ -3,6 +3,7 @@ public class Context extends Handle { private native long New(); + private native long Free(long handle); private native void SetLogLevel(long handle, int loglevel); private native void SetLogFunc(long handle, LogFunc logfunc); @@ -34,6 +35,13 @@ public void SetLogFunc(LogFunc logfunc) SetLogFunc(handle, logfunc); } + @Override + public void close() + { + Free(handle); + handle = 0; + } + static { System.loadLibrary("divecomputer-java"); } diff --git a/org/libdivecomputer/Descriptor.java b/org/libdivecomputer/Descriptor.java index 220f0b2..86c7677 100644 --- a/org/libdivecomputer/Descriptor.java +++ b/org/libdivecomputer/Descriptor.java @@ -4,6 +4,7 @@ public class Descriptor extends Handle { + private native long Free(long handle); private native String Vendor(long handle); private native String Product(long handle); private native int Type(long handle); @@ -42,6 +43,13 @@ public int Transports() return Transports(handle); } + @Override + public void close() + { + Free(handle); + handle = 0; + } + static { System.loadLibrary("divecomputer-java"); } diff --git a/org/libdivecomputer/Device.java b/org/libdivecomputer/Device.java index 89383c7..7cbffa2 100644 --- a/org/libdivecomputer/Device.java +++ b/org/libdivecomputer/Device.java @@ -3,6 +3,7 @@ public class Device extends Handle { private native long Open(long context, long descriptor, long iostream); + private native long Close(long handle); private native void Foreach(long handle, Callback callback); private native void SetFingerprint(long handle, byte[] fingerprint); private native void SetEvents(long handle, Events events); @@ -49,6 +50,13 @@ public void SetCancel(Cancel cancel) SetCancel(handle, cancel); } + @Override + public void close() + { + Close(handle); + handle = 0; + } + static { System.loadLibrary("divecomputer-java"); } diff --git a/org/libdivecomputer/Handle.java b/org/libdivecomputer/Handle.java index dd0e82d..2f589ff 100644 --- a/org/libdivecomputer/Handle.java +++ b/org/libdivecomputer/Handle.java @@ -1,6 +1,6 @@ package org.libdivecomputer; -abstract class Handle +abstract class Handle implements AutoCloseable { public long handle = 0; } diff --git a/org/libdivecomputer/IOStream.java b/org/libdivecomputer/IOStream.java index 3fac36e..d360cc1 100644 --- a/org/libdivecomputer/IOStream.java +++ b/org/libdivecomputer/IOStream.java @@ -2,5 +2,17 @@ public abstract class IOStream extends Handle { + private native long Close(long handle); + + @Override + public void close() + { + Close(handle); + handle = 0; + } + + static { + System.loadLibrary("divecomputer-java"); + } } diff --git a/org/libdivecomputer/Parser.java b/org/libdivecomputer/Parser.java index c3f569c..c33ad39 100644 --- a/org/libdivecomputer/Parser.java +++ b/org/libdivecomputer/Parser.java @@ -4,6 +4,7 @@ public class Parser extends Handle { private native long New(long device, byte[] data); private native long New2(long context, long descriptor, byte[] data); + private native long Free(long handle); private native void Foreach(long handle, Callback callback); private native void GetDatetime(long handle, Datetime datetime); private native void GetSalinity(long handle, Salinity salinity); @@ -185,6 +186,13 @@ public void Foreach(Callback callback) Foreach(handle, callback); } + @Override + public void close() + { + Free(handle); + handle = 0; + } + static { System.loadLibrary("divecomputer-java"); } diff --git a/org_libdivecomputer_Context.c b/org_libdivecomputer_Context.c index abeae6d..b3badb6 100644 --- a/org_libdivecomputer_Context.c +++ b/org_libdivecomputer_Context.c @@ -37,6 +37,12 @@ JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Context_New return (jlong) context; } +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Context_Free + (JNIEnv *env, jobject obj, jlong handle) +{ + dc_context_free ((dc_context_t *) handle); +} + JNIEXPORT void JNICALL Java_org_libdivecomputer_Context_SetLogLevel (JNIEnv *env, jobject obj, jlong handle, jint loglevel) { diff --git a/org_libdivecomputer_Context.h b/org_libdivecomputer_Context.h index b23e7a4..31f4d23 100644 --- a/org_libdivecomputer_Context.h +++ b/org_libdivecomputer_Context.h @@ -15,6 +15,14 @@ extern "C" { JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Context_New (JNIEnv *, jobject); +/* + * Class: org_libdivecomputer_Context + * Method: Free + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Context_Free + (JNIEnv *, jobject, jlong); + /* * Class: org_libdivecomputer_Context * Method: SetLogLevel diff --git a/org_libdivecomputer_Descriptor.c b/org_libdivecomputer_Descriptor.c index f52177a..1a23479 100644 --- a/org_libdivecomputer_Descriptor.c +++ b/org_libdivecomputer_Descriptor.c @@ -2,6 +2,12 @@ #include +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Descriptor_Free + (JNIEnv *env, jobject obj, jlong handle) +{ + dc_descriptor_free ((dc_descriptor_t *) handle); +} + JNIEXPORT jstring JNICALL Java_org_libdivecomputer_Descriptor_Vendor (JNIEnv *env, jobject obj, jlong handle) { diff --git a/org_libdivecomputer_Descriptor.h b/org_libdivecomputer_Descriptor.h index 3e9e712..9697f1b 100644 --- a/org_libdivecomputer_Descriptor.h +++ b/org_libdivecomputer_Descriptor.h @@ -7,6 +7,14 @@ #ifdef __cplusplus extern "C" { #endif +/* + * Class: org_libdivecomputer_Descriptor + * Method: Free + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Descriptor_Free + (JNIEnv *, jobject, jlong); + /* * Class: org_libdivecomputer_Descriptor * Method: Vendor diff --git a/org_libdivecomputer_Device.c b/org_libdivecomputer_Device.c index a97b392..f0abbe8 100644 --- a/org_libdivecomputer_Device.c +++ b/org_libdivecomputer_Device.c @@ -104,6 +104,12 @@ JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Device_Open return (jlong) device; } +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Device_Close + (JNIEnv *env, jobject obj, jlong handle) +{ + dc_device_close ((dc_device_t *) handle); +} + JNIEXPORT void JNICALL Java_org_libdivecomputer_Device_Foreach (JNIEnv *env, jobject obj, jlong handle, jobject callback) { diff --git a/org_libdivecomputer_Device.h b/org_libdivecomputer_Device.h index 3b19832..27c4b1f 100644 --- a/org_libdivecomputer_Device.h +++ b/org_libdivecomputer_Device.h @@ -15,6 +15,14 @@ extern "C" { JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Device_Open (JNIEnv *, jobject, jlong, jlong, jlong); +/* + * Class: org_libdivecomputer_Device + * Method: Close + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Device_Close + (JNIEnv *, jobject, jlong); + /* * Class: org_libdivecomputer_Device * Method: Foreach diff --git a/org_libdivecomputer_IOStream.c b/org_libdivecomputer_IOStream.c new file mode 100644 index 0000000..e6df362 --- /dev/null +++ b/org_libdivecomputer_IOStream.c @@ -0,0 +1,9 @@ +#include "org_libdivecomputer_IOStream.h" + +#include + +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_IOStream_Close + (JNIEnv *env, jobject obj, jlong handle) +{ + dc_iostream_close ((dc_iostream_t *) handle); +} diff --git a/org_libdivecomputer_IOStream.h b/org_libdivecomputer_IOStream.h new file mode 100644 index 0000000..ecbb841 --- /dev/null +++ b/org_libdivecomputer_IOStream.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_libdivecomputer_IOStream */ + +#ifndef _Included_org_libdivecomputer_IOStream +#define _Included_org_libdivecomputer_IOStream +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_libdivecomputer_IOStream + * Method: Close + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_IOStream_Close + (JNIEnv *, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/org_libdivecomputer_Parser.c b/org_libdivecomputer_Parser.c index b98bd43..ec22ad2 100644 --- a/org_libdivecomputer_Parser.c +++ b/org_libdivecomputer_Parser.c @@ -168,6 +168,12 @@ JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Parser_New2 return (jlong) parser; } +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Parser_Free + (JNIEnv *env, jobject obj, jlong handle) +{ + dc_parser_destroy ((dc_parser_t *) handle); +} + JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_Foreach (JNIEnv *env, jobject obj, jlong handle, jobject callback) { diff --git a/org_libdivecomputer_Parser.h b/org_libdivecomputer_Parser.h index a99cea0..eb5d298 100644 --- a/org_libdivecomputer_Parser.h +++ b/org_libdivecomputer_Parser.h @@ -23,6 +23,14 @@ JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Parser_New JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Parser_New2 (JNIEnv *, jobject, jlong, jlong, jbyteArray); +/* + * Class: org_libdivecomputer_Parser + * Method: Free + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Parser_Free + (JNIEnv *, jobject, jlong); + /* * Class: org_libdivecomputer_Parser * Method: Foreach