From 9b5a7febcc8f39eae7909073b563b1c486d45e80 Mon Sep 17 00:00:00 2001 From: Sam948-byte Date: Sat, 2 Aug 2025 13:03:35 -0500 Subject: [PATCH 1/3] update forceLoad to return true --- .../java/org/photonvision/jni/PhotonJNICommon.java | 13 +++++++------ .../java/org/photonvision/jni/RknnDetectorJNI.java | 4 ++-- .../java/org/photonvision/mrcal/MrCalJNILoader.java | 10 +++------- .../org/photonvision/raspi/LibCameraJNILoader.java | 7 ++++--- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java b/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java index 1938cdee17..d8c6878db7 100644 --- a/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java +++ b/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java @@ -32,9 +32,9 @@ public abstract class PhotonJNICommon { protected static Logger logger = null; - protected static synchronized void forceLoad( + protected static synchronized boolean forceLoad( PhotonJNICommon instance, Class clazz, List libraries) throws IOException { - if (instance.isLoaded()) return; + if (instance.isLoaded()) return true; if (logger == null) logger = new Logger(clazz, LogGroup.Camera); for (var libraryName : libraries) { @@ -46,7 +46,7 @@ protected static synchronized void forceLoad( if (in == null) { instance.setLoaded(false); - return; + return false; } // It's important that we don't mangle the names of these files on Windows at least @@ -70,14 +70,15 @@ protected static synchronized void forceLoad( e.printStackTrace(); // logger.error(System.getProperty("java.library.path")); instance.setLoaded(false); - return; + return false; } } instance.setLoaded(true); + return instance.isLoaded(); } - protected static synchronized void forceLoad( + protected static synchronized boolean forceLoad( PhotonJNICommon instance, Class clazz, String libraryName) throws IOException { - forceLoad(instance, clazz, List.of(libraryName)); + return forceLoad(instance, clazz, List.of(libraryName)); } } diff --git a/photon-core/src/main/java/org/photonvision/jni/RknnDetectorJNI.java b/photon-core/src/main/java/org/photonvision/jni/RknnDetectorJNI.java index 6ad21fd9cd..1a950d7685 100644 --- a/photon-core/src/main/java/org/photonvision/jni/RknnDetectorJNI.java +++ b/photon-core/src/main/java/org/photonvision/jni/RknnDetectorJNI.java @@ -35,10 +35,10 @@ public static RknnDetectorJNI getInstance() { return instance; } - public static synchronized void forceLoad() throws IOException { + public static synchronized boolean forceLoad() throws IOException { TestUtils.loadLibraries(); - forceLoad(getInstance(), RknnDetectorJNI.class, List.of("rga", "rknnrt", "rknn_jni")); + return forceLoad(getInstance(), RknnDetectorJNI.class, List.of("rga", "rknnrt", "rknn_jni")); } @Override diff --git a/photon-core/src/main/java/org/photonvision/mrcal/MrCalJNILoader.java b/photon-core/src/main/java/org/photonvision/mrcal/MrCalJNILoader.java index 051c7978e5..53b855d475 100644 --- a/photon-core/src/main/java/org/photonvision/mrcal/MrCalJNILoader.java +++ b/photon-core/src/main/java/org/photonvision/mrcal/MrCalJNILoader.java @@ -37,14 +37,14 @@ public static synchronized MrCalJNILoader getInstance() { return instance; } - public static synchronized void forceLoad() throws IOException { + public static synchronized boolean forceLoad() throws IOException { // Force load opencv TestUtils.loadLibraries(); // Library naming is dumb and has "lib" appended for Windows when it ought not to if (Platform.isWindows()) { // Order is correct to match dependencies of libraries - forceLoad( + return forceLoad( MrCalJNILoader.getInstance(), MrCalJNILoader.class, List.of( @@ -62,11 +62,7 @@ public static synchronized void forceLoad() throws IOException { "mrcal_jni")); } else { // Nothing else to do on linux - forceLoad(MrCalJNILoader.getInstance(), MrCalJNILoader.class, List.of("mrcal_jni")); - } - - if (!MrCalJNILoader.getInstance().isLoaded()) { - throw new IOException("Unable to load mrcal JNI!"); + return forceLoad(MrCalJNILoader.getInstance(), MrCalJNILoader.class, List.of("mrcal_jni")); } } diff --git a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNILoader.java b/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNILoader.java index 60256faa42..1904ff6da8 100644 --- a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNILoader.java +++ b/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNILoader.java @@ -31,8 +31,8 @@ public class LibCameraJNILoader { private static boolean libraryLoaded = false; private static final Logger logger = new Logger(LibCameraJNILoader.class, LogGroup.Camera); - public static synchronized void forceLoad() throws IOException { - if (libraryLoaded) return; + public static synchronized boolean forceLoad() throws IOException { + if (libraryLoaded) return true; var libraryName = "photonlibcamera"; @@ -46,7 +46,7 @@ public static synchronized void forceLoad() throws IOException { if (in == null) { logger.error("Failed to find internal native library at path " + resourcePath); libraryLoaded = false; - return; + return false; } // It's important that we don't mangle the names of these files on Windows at least @@ -71,6 +71,7 @@ public static synchronized void forceLoad() throws IOException { // logger.error(System.getProperty("java.library.path")); } libraryLoaded = true; + return libraryLoaded; } public static boolean isSupported() { From dbe931e2b7e6ca38369138c943c46fb87423e474 Mon Sep 17 00:00:00 2001 From: Sam948-byte Date: Sat, 2 Aug 2025 13:05:53 -0500 Subject: [PATCH 2/3] update main to error if loading fails --- .../src/main/java/org/photonvision/Main.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/photon-server/src/main/java/org/photonvision/Main.java b/photon-server/src/main/java/org/photonvision/Main.java index 7e527e3f83..61f29d6004 100644 --- a/photon-server/src/main/java/org/photonvision/Main.java +++ b/photon-server/src/main/java/org/photonvision/Main.java @@ -223,14 +223,22 @@ public static void main(String[] args) { try { if (Platform.isRaspberryPi()) { - LibCameraJNILoader.forceLoad(); + if (LibCameraJNILoader.forceLoad()) { + logger.info("libcamera-JNI loaded successfully."); + } else { + logger.error("Failed to load libcamera-JNI!"); + } } } catch (IOException e) { logger.error("Failed to load libcamera-JNI!", e); } try { if (Platform.isRK3588()) { - RknnDetectorJNI.forceLoad(); + if (RknnDetectorJNI.forceLoad()) { + logger.info("RKNN-JNI loaded successfully."); + } else { + logger.error("Failed to load RKNN-JNI!"); + } } else { logger.error("Platform does not support RKNN based machine learning!"); } @@ -238,7 +246,11 @@ public static void main(String[] args) { logger.error("Failed to load rknn-JNI!", e); } try { - MrCalJNILoader.forceLoad(); + if (MrCalJNILoader.forceLoad()) { + logger.info("mrcal-JNI loaded successfully."); + } else { + logger.error("Failed to load mrcal-JNI!"); + } } catch (IOException e) { logger.warn( "Failed to load mrcal-JNI! Camera calibration will fall back to opencv\n" From 610f1e285907774d5598e4cf87dd9e0adf5daced Mon Sep 17 00:00:00 2001 From: Sam948-byte Date: Sat, 2 Aug 2025 21:26:54 -0500 Subject: [PATCH 3/3] error on library not found --- .../src/main/java/org/photonvision/jni/PhotonJNICommon.java | 1 + 1 file changed, 1 insertion(+) diff --git a/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java b/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java index d8c6878db7..ef14e8b29e 100644 --- a/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java +++ b/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java @@ -46,6 +46,7 @@ protected static synchronized boolean forceLoad( if (in == null) { instance.setLoaded(false); + logger.error("Failed to find internal native library " + nativeLibName); return false; }