完成linux的测试

This commit is contained in:
Guan Yuankai 2025-11-14 20:21:04 +08:00
parent 74f762c8e9
commit 84125e62ec
13 changed files with 163 additions and 25 deletions

View File

@ -1,4 +1,13 @@
# sishu-yolo-sdk # sishu-yolo-sdk
javac -h cpp/include src/main/java/com/bonus/sdk/YoloSdk.java src/main/java/com/bonus/sdk/Detection.java
windows
cmake -S cpp -B build/windows -G "Visual Studio 17 2022" -A x64 -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake cmake -S cpp -B build/windows -G "Visual Studio 17 2022" -A x64 -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake
cmake --build build/windows --config Release cmake --build build/windows --config Release
linux
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 cmake -S cpp -B build/linux
<!-- cmake -S cpp -B build/linux -->
cmake --build build/linux

View File

@ -2,11 +2,9 @@ cmake_minimum_required(VERSION 3.18)
project(MyYoloSdk CXX) project(MyYoloSdk CXX)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
# --- 1.
find_package(JNI REQUIRED)
# --- 2.
if(WIN32) if(WIN32)
find_package(JNI COMPONENTS JNI REQUIRED)
message(STATUS "Configuring for Windows (using vcpkg OpenCV + manual ONNX)") message(STATUS "Configuring for Windows (using vcpkg OpenCV + manual ONNX)")
# #
@ -16,6 +14,11 @@ if(WIN32)
set(ORT_MANUAL_PATH ${CMAKE_SOURCE_DIR}/../prebuilt_libs/onnxruntime-win-x64-1.23.2) set(ORT_MANUAL_PATH ${CMAKE_SOURCE_DIR}/../prebuilt_libs/onnxruntime-win-x64-1.23.2)
elseif(UNIX) elseif(UNIX)
set(JNI_INCLUDE_DIRS
"/usr/lib/jvm/java-11-openjdk-amd64/include"
"/usr/lib/jvm/java-11-openjdk-amd64/include/linux"
)
set(JNI_LIBRARIES "/usr/lib/jvm/java-11-openjdk-amd64/lib/server/libjvm.so")
message(STATUS "Configuring for Linux (using apt OpenCV + manual ONNX)") message(STATUS "Configuring for Linux (using apt OpenCV + manual ONNX)")
# #

View File

@ -96,11 +96,7 @@ YoloDetector::YoloDetector(const ORTCHAR_T* model_path, int in_width, int in_hei
Ort::SessionOptions session_options; Ort::SessionOptions session_options;
// session_options.AppendExecutionProvider_CPU(0);
OrtCUDAProviderOptions cuda_options;
session_options.AppendExecutionProvider_CUDA(cuda_options);
session = std::make_unique<Ort::Session>(env, model_path, session_options); session = std::make_unique<Ort::Session>(env, model_path, session_options);

View File

@ -119,7 +119,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_bonus_sdk_YoloSdk_nativePredict
jclass detClass = env->FindClass("com/bonus/sdk/Detection"); jclass detClass = env->FindClass("com/bonus/sdk/Detection");
if (!detClass) return nullptr; if (!detClass) return nullptr;
jmethodID detConstructor = env->GetMethodID(detClass, "<init>", "(IFFIIII)V"); jmethodID detConstructor = env->GetMethodID(detClass, "<init>", "(IFIIII)V");
if (!detConstructor) return nullptr; if (!detConstructor) return nullptr;
jobjectArray resultArray = env->NewObjectArray(results_cpp.size(), detClass, nullptr); jobjectArray resultArray = env->NewObjectArray(results_cpp.size(), detClass, nullptr);

29
pom.xml
View File

@ -14,7 +14,20 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build> <build>
<sourceDirectory>src/main/java</sourceDirectory> <sourceDirectory>src/main/java</sourceDirectory>
@ -25,7 +38,9 @@
<includes> <includes>
<include>libmy_yolo_sdk.so</include> <include>libmy_yolo_sdk.so</include>
<include>libonnxruntime.so*</include> <include>libonnxruntime.so*</include>
<include>libopencv_world.so*</include> <include>libopencv_dnn.so*</include>
<include>libopencv_imgproc.so*</include>
<include>libopencv_core.so*</include>
</includes> </includes>
<targetPath>lib/linux-x86_64</targetPath> <targetPath>lib/linux-x86_64</targetPath>
</resource> </resource>
@ -36,7 +51,9 @@
<includes> <includes>
<include>my_yolo_sdk.dll</include> <include>my_yolo_sdk.dll</include>
<include>onnxruntime.dll</include> <include>onnxruntime.dll</include>
<include>opencv_world*.dll</include> <include>opencv_core4.dll</include>
<include>opencv_dnn4.dll</include>
<include>opencv_imgproc4.dll</include>
</includes> </includes>
<targetPath>lib/win-x64</targetPath> <targetPath>lib/win-x64</targetPath>
</resource> </resource>
@ -52,6 +69,12 @@
<target>11</target> <target>11</target>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
package com.bonus.sdk; // package com.bonus.sdk;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte; import java.awt.image.DataBufferByte;
@ -10,9 +10,11 @@ import java.util.Set;
public class YoloSdk implements AutoCloseable { public class YoloSdk implements AutoCloseable {
private long nativeHandle; private long nativeHandle; //
private static final Set<String> loadedLibraries = new HashSet<>(); private static final Set<String> loadedLibraries = new HashSet<>();
/**
* */
static { static {
try { try {
loadSdkLibrary(); loadSdkLibrary();
@ -40,13 +42,11 @@ public class YoloSdk implements AutoCloseable {
"opencv_core4.dll", "opencv_core4.dll",
"opencv_imgproc4.dll", "opencv_imgproc4.dll",
"opencv_dnn4.dll" "opencv_dnn4.dll"
}; };
sdkLibName = "my_yolo_sdk.dll"; sdkLibName = "my_yolo_sdk.dll";
} else if ((osName.contains("nix") || osName.contains("nux")) && osArch.contains("64")) { } else if ((osName.contains("nix") || osName.contains("nux")) && osArch.contains("64")) {
libPathInJar = "/lib/linux-x86_64/"; libPathInJar = "/lib/linux-x86_64/";
dependencyLibs = new String[]{ dependencyLibs = new String[]{
@ -62,18 +62,20 @@ public class YoloSdk implements AutoCloseable {
throw new UnsupportedOperationException("Unsupported OS/Arch: " + osName + "/" + osArch); throw new UnsupportedOperationException("Unsupported OS/Arch: " + osName + "/" + osArch);
} }
// 1.
for (String lib : dependencyLibs) { for (String lib : dependencyLibs) {
loadLibraryFromJar(libPathInJar + lib); loadLibraryFromJar(libPathInJar + lib);
} }
// 2.
loadLibraryFromJar(libPathInJar + sdkLibName); loadLibraryFromJar(libPathInJar + sdkLibName);
} }
/**
* */
private static void loadLibraryFromJar(String path) throws IOException { private static void loadLibraryFromJar(String path) throws IOException {
String libName = new File(path).getName(); String libName = new File(path).getName();
if (loadedLibraries.contains(libName)) { if (loadedLibraries.contains(libName)) {
return; return; //
} }
try (InputStream in = YoloSdk.class.getResourceAsStream(path)) { try (InputStream in = YoloSdk.class.getResourceAsStream(path)) {
@ -90,6 +92,7 @@ public class YoloSdk implements AutoCloseable {
} }
} }
// ---
private native long nativeInit(String modelPath, int inputWidth, int inputHeight); private native long nativeInit(String modelPath, int inputWidth, int inputHeight);
private native void nativeRelease(long handle); private native void nativeRelease(long handle);
private native Detection[] nativePredict( private native Detection[] nativePredict(
@ -124,6 +127,8 @@ public class YoloSdk implements AutoCloseable {
} }
} }
/**
* */
private byte[] getBgrBytes(BufferedImage image) { private byte[] getBgrBytes(BufferedImage image) {
if (image.getType() == BufferedImage.TYPE_3BYTE_BGR) { if (image.getType() == BufferedImage.TYPE_3BYTE_BGR) {
return ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); return ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

View File

@ -0,0 +1,102 @@
package com.bonus.sdk;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* */
public class YoloSdkTest {
private static final String modelPath = "test_data/model.onnx";
private static final String imagePath = "test_data/test_image.jpg";
private static File modelFile;
private static File imageFile;
/**
* */
@BeforeAll
public static void setupTestFiles() {
System.out.println("--- [YoloSdkTest] Setting up test files...");
modelFile = new File(modelPath);
imageFile = new File(imagePath);
boolean modelExists = modelFile.exists();
boolean imageExists = imageFile.exists();
System.out.println("Checking model: " + modelFile.getAbsolutePath() + " (Exists: " + modelExists + ")");
System.out.println("Checking image: " + imageFile.getAbsolutePath() + " (Exists: " + imageExists + ")");
Assumptions.assumeTrue(modelExists, "SKIPPING TEST: Model file not found at " + modelPath);
Assumptions.assumeTrue(imageExists, "SKIPPING TEST: Test image not found at " + imagePath);
}
/**
* */
@Test
public void testSdkInitializationAndPrediction() {
System.out.println("--- [YoloSdkTest] Running testSdkInitializationAndPrediction...");
try {
System.out.println("Loading image from: " + imageFile.getAbsolutePath());
BufferedImage image = ImageIO.read(imageFile);
Assertions.assertNotNull(image, "Failed to read image. ImageIO.read() returned null.");
System.out.println("Initializing YoloSdk with model: " + modelFile.getAbsolutePath());
try (YoloSdk sdk = new YoloSdk(modelFile.getAbsolutePath(), 640, 640)) {
System.out.println("Native SDK initialized successfully.");
System.out.println("Running prediction...");
Detection[] results = sdk.predict(image, 0.45f, 0.5f);
System.out.println("Prediction complete.");
Assertions.assertNotNull(results, "Prediction results array should not be null.");
System.out.println("--- [YoloSdkTest] PREDICTION RESULTS ---");
System.out.println("--- [YoloSdkTest] Found " + results.length + " objects ---");
if (results.length == 0) {
System.out.println("No objects detected.");
} else {
System.out.println("Detected " + results.length + " objects:");
for (Detection d : results) {
System.out.println(" - " + d.toString());
}
}
System.out.println("--- [YoloSdkTest] END OF RESULTS ---");
}
System.out.println("SDK closed successfully.");
} catch (IOException e) {
Assertions.fail("Failed to read image file", e);
} catch (Exception e) {
e.printStackTrace();
Assertions.fail("SDK test failed with a runtime exception: " + e.getMessage());
}
System.out.println("--- [YoloSdkTest] Test finished successfully. ---");
}
}

BIN
test_data/model.onnx Normal file

Binary file not shown.

BIN
test_data/test_image.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB