From 1e4c18777d982061f5e507a4d4f4f1cd4d685268 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 9 Sep 2010 17:49:37 -0700 Subject: altosui: Need to have JVM include path substituted into libaltos Makefile The libaltos Makefile needs to find the relevant jni.h file, which is found in the JVM_INCLUDE path, all nicely located by the configure.ac script. Signed-off-by: Keith Packard --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index d376af3f..61c03b18 100644 --- a/configure.ac +++ b/configure.ac @@ -56,6 +56,8 @@ if test "x$JVM_INCLUDE" = "xauto"; then AC_MSG_RESULT([$JVM_INCLUDE]) fi +AC_SUBST(JVM_INCLUDE) + AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S -- cgit v1.2.3 From 4224a7526e51eb8fbf1f0a31bae7ee68c6385095 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 9 Sep 2010 17:52:46 -0700 Subject: altosui: Store libaltos.so in $(libdir)/altos It's not a public library, so hide it away in a subdirectory. Signed-off-by: Keith Packard --- ao-tools/altosui/Makefile.am | 6 ++++-- ao-tools/libaltos/Makefile.am | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ao-tools/altosui/Makefile.am b/ao-tools/altosui/Makefile.am index 760e662d..804e0c74 100644 --- a/ao-tools/altosui/Makefile.am +++ b/ao-tools/altosui/Makefile.am @@ -1,6 +1,8 @@ JAVAROOT=classes AM_JAVACFLAGS=-encoding UTF-8 +altoslibdir=$(libdir)/altos + CLASSPATH_ENV=mkdir -p $(JAVAROOT); CLASSPATH=".:classes:../libaltos:$(FREETTS)/*:/usr/share/java/*" bin_SCRIPTS=altosui @@ -131,12 +133,12 @@ Manifest-fat.txt: altosui: Makefile echo "#!/bin/sh" > $@ - echo 'exec java -cp "$(FREETTS)/*" -Djava.library.path="$(libdir)" -jar "$(altosuidir)/altosui.jar" "$$@"' >> $@ + echo 'exec java -cp "$(FREETTS)/*" -Djava.library.path="$(altoslibdir)" -jar "$(altosuidir)/altosui.jar" "$$@"' >> $@ chmod +x $@ altosui-test: Makefile echo "#!/bin/sh" > $@ - echo 'exec java -cp "$(FREETTS)/*" -Djava.library.path="../libaltos" -jar altosui.jar "$$*"' >> $@ + echo 'exec java -cp "$(FREETTS)/*" -Djava.library.path="../libaltos/.libs" -jar altosui.jar "$$@"' >> $@ chmod +x $@ $(LIBALTOS): diff --git a/ao-tools/libaltos/Makefile.am b/ao-tools/libaltos/Makefile.am index 4d29d80e..388d2104 100644 --- a/ao-tools/libaltos/Makefile.am +++ b/ao-tools/libaltos/Makefile.am @@ -1,11 +1,22 @@ JAVAC=javac -AM_CFLAGS="-I$(JVM_INCLUDE)" +AM_CFLAGS=-DLINUX -DPOSIX_TTY -I$(JVM_INCLUDE) AM_JAVACFLAGS=-encoding UTF-8 -lib_LTLIBRARIES=libaltos.la +altoslibdir=$(libdir)/altos + +altoslib_LTLIBRARIES=libaltos.la + +libaltos_la_LDFLAGS = -version-info 1:0:1 libaltos_la_SOURCES=\ - libaltos.c + libaltos.c \ + libaltos_wrap.c + +noinst_PROGRAMS=cjnitest + +cjnitest_LDADD=libaltos.la + +LIBS= HFILES=libaltos.h @@ -18,6 +29,8 @@ $(SWIG_FILE): libaltos.i0 $(HFILES) all-local: classlibaltos.stamp +libaltos_wrap.c: classlibaltos.stamp + classlibaltos.stamp: $(SWIG_FILE) swig -java -package libaltosJNI $(SWIG_FILE) mkdir -p libaltosJNI @@ -25,4 +38,4 @@ classlibaltos.stamp: $(SWIG_FILE) touch classlibaltos.stamp clean-local: - -rm -rf libaltosJNI *.class *.java classlibaltos.stamp $(SWIG_FILE) \ No newline at end of file + -rm -rf libaltosJNI *.class *.java classlibaltos.stamp $(SWIG_FILE) libaltos_wrap.c -- cgit v1.2.3 From 8ee3464d8064ebe1694c7b20177878c0d9961451 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 9 Sep 2010 17:54:41 -0700 Subject: altosui: Display error dialog when AltOS JNI library can't be loaded Having an error dialog appear at application startup seems better than simply failing to present the device dialog later on. Signed-off-by: Keith Packard --- ao-tools/altosui/AltosDevice.java | 77 ++++++++++++++++++++++++++------- ao-tools/altosui/AltosDeviceDialog.java | 13 ++++-- ao-tools/altosui/AltosUI.java | 14 ++++++ 3 files changed, 85 insertions(+), 19 deletions(-) diff --git a/ao-tools/altosui/AltosDevice.java b/ao-tools/altosui/AltosDevice.java index e62a0a7a..9ae522c2 100644 --- a/ao-tools/altosui/AltosDevice.java +++ b/ao-tools/altosui/AltosDevice.java @@ -22,20 +22,67 @@ import libaltosJNI.*; public class AltosDevice extends altos_device { - static boolean initialized = false; - static { - try { - System.loadLibrary("altos"); - libaltos.altos_init(); + static public boolean initialized = false; + static public boolean loaded_library = false; + + public static boolean load_library() { + if (!initialized) { + try { + System.loadLibrary("altos"); + libaltos.altos_init(); + loaded_library = true; + } catch (UnsatisfiedLinkError e) { + loaded_library = false; + } initialized = true; - } catch (UnsatisfiedLinkError e) { - System.err.println("Native library failed to load.\n" + e); } + return loaded_library; + } + + static int usb_product_altusmetrum() { + if (load_library()) + return libaltosConstants.USB_PRODUCT_ALTUSMETRUM; + return 0x000a; + } + + static int usb_product_altusmetrum_min() { + if (load_library()) + return libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MIN; + return 0x000a; + } + + static int usb_product_altusmetrum_max() { + if (load_library()) + return libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MAX; + return 0x000d; + } + + static int usb_product_telemetrum() { + if (load_library()) + return libaltosConstants.USB_PRODUCT_TELEMETRUM; + return 0x000b; + } + + static int usb_product_teledongle() { + if (load_library()) + return libaltosConstants.USB_PRODUCT_ALTUSMETRUM; + return 0x000c; + } + + static int usb_product_teleterra() { + if (load_library()) + return libaltosConstants.USB_PRODUCT_ALTUSMETRUM; + return 0x000d; } - public final static int AltusMetrum = libaltosConstants.USB_PRODUCT_ALTUSMETRUM; - public final static int TeleMetrum = libaltosConstants.USB_PRODUCT_TELEMETRUM; - public final static int TeleDongle = libaltosConstants.USB_PRODUCT_TELEDONGLE; - public final static int TeleTerra = libaltosConstants.USB_PRODUCT_TELETERRA; + + public final static int AltusMetrum = usb_product_altusmetrum(); + public final static int TeleMetrum = usb_product_telemetrum(); + public final static int TeleDongle = usb_product_teledongle(); + public final static int TeleTerra = usb_product_teleterra(); + public final static int AltusMetrumMin = usb_product_altusmetrum_min(); + public final static int AltusMetrumMax = usb_product_altusmetrum_max(); + + public final static int Any = 0x10000; public final static int BaseStation = 0x10000 + 1; @@ -48,11 +95,11 @@ public class AltosDevice extends altos_device { } public boolean isAltusMetrum() { - if (getVendor() != libaltosConstants.USB_VENDOR_ALTUSMETRUM) + if (getVendor() != AltusMetrum) return false; - if (getProduct() < libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MIN) + if (getProduct() < AltusMetrumMin) return false; - if (getProduct() > libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MAX) + if (getProduct() > AltusMetrumMax) return false; return true; } @@ -80,7 +127,7 @@ public class AltosDevice extends altos_device { } static AltosDevice[] list(int product) { - if (!initialized) + if (!load_library()) return null; SWIGTYPE_p_altos_list list = libaltos.altos_list_start(); diff --git a/ao-tools/altosui/AltosDeviceDialog.java b/ao-tools/altosui/AltosDeviceDialog.java index 3df4c6eb..ec78e288 100644 --- a/ao-tools/altosui/AltosDeviceDialog.java +++ b/ao-tools/altosui/AltosDeviceDialog.java @@ -49,10 +49,15 @@ public class AltosDeviceDialog extends JDialog implements ActionListener { dialog.setVisible(true); return value; } else { - JOptionPane.showMessageDialog(frame, - "No AltOS devices available", - "No AltOS devices", - JOptionPane.ERROR_MESSAGE); + /* check for missing altos JNI library, which + * will put up its own error dialog + */ + if (AltosUI.load_library(frame)) { + JOptionPane.showMessageDialog(frame, + "No AltOS devices available", + "No AltOS devices", + JOptionPane.ERROR_MESSAGE); + } return null; } } diff --git a/ao-tools/altosui/AltosUI.java b/ao-tools/altosui/AltosUI.java index 3aaeb888..ca587b25 100644 --- a/ao-tools/altosui/AltosUI.java +++ b/ao-tools/altosui/AltosUI.java @@ -70,8 +70,22 @@ public class AltosUI extends JFrame { public AltosVoice voice = new AltosVoice(); + public static boolean load_library(Frame frame) { + if (!AltosDevice.load_library()) { + JOptionPane.showMessageDialog(frame, + String.format("No AltOS library in \"%s\"", + System.getProperty("java.library.path","")), + "Cannot load device access library", + JOptionPane.ERROR_MESSAGE); + return false; + } + return true; + } + public AltosUI() { + load_library(null); + String[] statusNames = { "Height (m)", "State", "RSSI (dBm)", "Speed (m/s)" }; Object[][] statusData = { { "0", "pad", "-50", "0" } }; -- cgit v1.2.3