eclipse jni报错:UnsatisfiedLinkError: no *** in java.library.path

在Eclipse中使用JNI技术时,遇到`UnsatisfiedLinkError: no jni_so_test in java.library.path`错误。原因是Java工程无法找到C工程生成的`libjni_so_test.so`动态链接库。解决方法是配置Java工程的`java.library.path`,指向C工程`jni_so_test/Debug`目录,确保Java能加载到动态链接库。在C工程中,动态链接库文件名应为`lib+工程名+.so`,而在Java中调用`System.loadLibrary`时只需提供工程名,JNI会自动添加前缀和后缀。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用场景

        在eclipse中使用jni技术,在java工程主类中声明native本地动态链接库函数,并在static静态代码块中加载名为”jni_so_test“的本地动态链接库。

        使用javah命令生成本地动态链接库头文件,一般与Java主类的名称相同,我的Java主类名为JNItest,所以生成的头文件为”JNItest.h“。

        创建一个名为”jni_so_test“的C Project,将JNItest.h拷贝到”jni_so_test“工程中,并创建实现源文件”JNItest.c“实现这个头文件。这样关于本地链接库的所有开发都可以在这个C工程中了。

        运行JNItest Java工程,此时会报错:Exception in thread "main" java.lang.UnsatisfiedLinkError: no jni_so_test in java.library.path。意思是JNItest.java中System.loadLibrary("jni_so_test");执行时找不到C工程”jni_so_test“生成的so动态链接库文件,如下图:

运行项目报错:

        下一步我们要配置java.library.path,使得JNItest.java运行时能在java.library.path变量中找到C工程”jni_so_test“中生成的”libjni_so_test.so“动态链接库,配置方法如下:右键Java工程”JNItest“,选择菜单”Build Path——Configure Build Path...“,在弹出配置页面展开”JRE System Library[JavaSE-1.7]“,java版本每人电脑可能不同。双击”Native library location:(None)“,在弹出的”Native Library Folder Configuration“页面,填写动态链接库位置。”External Folder...“意思是打开eclipse当前的workspace文件夹以外的目录,而”Workspace...“选项意思是打开workspace内某个工程的目录。由于我创建了名为jni_so_test的C Project编写本地链接库代码,生成的动态链接库文件在工程下的Debug/libjni_so_test.so,所以目录要配置成”jni_so_test/Debug“。这样我们就可以分开编写动态链接库代码和Java代码了,而且由于java的build path配置了C Project中so文件生成的目录,这样两边编码互不影响,java代码还能实时加载最新的动态链接库。

       当然,配置动态链接库的目录看个人需求和习惯而定了。



     这里有一点需要特别注意:在jni_so_test工程中生成的so动态链接库文件,命名的方式为”lib+【C工程名称】+.so“,所以在C工程”jni_so_test“生成的动态文件为”libjni_so_test.so“(Windows下为libjni_so_test.dll)。但是在java主类JNItest.java中却不能这么写,因为lib和.so都是JNI自动添加上去的:

    


       所以,System.loadLibrary中的库名称只能填写”jni_so_test“,”lib“前缀JNI会自己加上,并且根据系统不同自动生成后缀,如果是Linux系统,后缀为”.so“,如果是Windows,后缀则自动生成为”.dll“。

       换一句话来说,不管是通过Eclipse来生成动态链接库文件,还是通过命令行生成,但是生成的动态链接库文件名称前缀必须是”lib“,不然JNI无法解决。




!SESSION 2025-05-26 20:01:51.887 ----------------------------------------------- eclipse.buildId=4.29.0.20230907-1200 java.version=17.0.8.1 java.vendor=Eclipse Adoptium BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=zh_CN Framework arguments: -product org.eclipse.epp.package.java.product Command-line arguments: -os linux -ws gtk -arch x86_64 -product org.eclipse.epp.package.java.product !ENTRY ch.qos.logback.classic 1 0 2025-05-26 20:02:04.760 !MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. !ENTRY org.eclipse.osgi 4 0 2025-05-26 20:02:07.219 !MESSAGE Application error !STACK 1 java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: no swt-pi4-gtk-4962r3 in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib no swt-pi4-gtk in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib no swt-pi4 in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib Can't load library: /root/.swt/lib/linux/x86_64/libswt-pi4-gtk-4962r3.so Can't load library: /root/.swt/lib/linux/x86_64/libswt-pi4-gtk.so Can't load library: /root/.swt/lib/linux/x86_64/libswt-pi4.so at org.eclipse.swt.internal.Library.loadLibrary(Library.java:346) at org.eclipse.swt.internal.Library.loadLibrary(Library.java:255) at org.eclipse.swt.internal.gtk.OS.<clinit>(OS.java:97) at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:209) at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:155) at org.eclipse.swt.widgets.Display.<clinit>(Display.java:169) at org.eclipse.ui.internal.Workbench.createDisplay(Workbench.java:727) at org.eclipse.ui.PlatformUI.createDisplay(PlatformUI.java:183) at org.eclipse.ui.internal.ide.application.IDEApplication.createDisplay(IDEApplication.java:182) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:125) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:651) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:588) at org.eclipse.equinox.launcher.Main.run(Main.java:1459) at org.eclipse.equinox.launcher.Main.main(Main.java:1432)
05-27
<think>我们遇到了一个依赖问题:在Spring Boot项目中无法找到'com.alphacephei:vosk:0.3.45'依赖。Vosk是一个离线的语音识别库,我们需要它来实现本地的语音识别功能(包括关键词和敏感词识别)。由于Vosk不在Maven中央仓库中,我们需要手动将其添加到本地Maven仓库或使用JitPack。###解决方案####方法1:从Vosk的GitHub仓库构建并安装到本地Maven仓库1.**克隆Vosk的GitHub仓库**:```bashgit clonehttps://github.com/alphacep/vosk-apicdvosk-api/java``` 2. **构建并安装到本地Maven仓库**:```bashmvn install```这将在你的本地Maven仓库(通常是`~/.m2/repository`)中安装`vosk`依赖。 3. **在SpringBoot项目中引用**:在`pom.xml`中添加依赖:```xml<dependency><groupId>com.alphacephei</groupId><artifactId>vosk</artifactId><version>0.3.45</version></dependency>```####方法2:使用JitPack(无需本地构建)Vosk的Java库也可以在JitPack上获取。按照以下步骤配置:1.**在`pom.xml`中添加JitPack仓库**:```xml<repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository></repositories>``` 2. **添加依赖**:```xml<dependency><groupId>com.github.alphacep</groupId><artifactId>vosk-api</artifactId><version>v0.3.45</version><classifier>java</classifier><!--指定Java包--></dependency>``` ####方法3:直接下载JAR并手动安装1. **下载JAR包**:从[Vosk的GitHub发布页面](https://github.com/alphacep/vosk-api/releases)下载对应版本的JavaJAR包(例如:`vosk-0.3.45-java.jar`)。2.**手动安装到本地Maven仓库**:```bashmvn install:install-file \-Dfile=vosk-0.3.45-java.jar \-DgroupId=com.alphacephei \-DartifactId=vosk \-Dversion=0.3.45 \-Dpackaging=jar```3.**在项目中引用**(同方法1)。###验证依赖是否解决在IDE中刷新Maven项目,确保依赖被正确解析。如果使用IntelliJIDEA,可以点击Maven面板的刷新按钮。###常见问题解决1.**依赖仍然找不到**:-检查本地Maven仓库路径(`~/.m2/repository/com/alphacephei/vosk/0.3.45`)是否存在。-如果使用JitPack,确保网络可以访问`https://jitpack.io`。 2. **构建Vosk源码时出错**:-确保已安装JDK和Maven。-可能需要安装FFmpeg开发库(在Linux上:`sudo apt-get installlibavdevice-dev libavfilter-dev`)。 3. **运行时缺少本地库**:Vosk依赖于本地库(如`libvosk_jni.so`、`libvosk.dylib`或`vosk.dll`)。确保将这些库放在Java库路径中,或通过`-Djava.library.path`指定路径。 ###示例:在SpringBoot项目中加载Vosk模型```javaimport org.vosk.Model; importorg.vosk.Recognizer;import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;import java.io.IOException; @Servicepublicclass SpeechRecognitionService{private Modelmodel;privateRecognizerrecognizer;@PostConstructpublicvoid init() throwsIOException {//加载模型(路径根据实际情况调整)model= newModel("models/vosk-model-cn-0.22");recognizer =new Recognizer(model,16000.0f);}publicString recognize(byte[]audioData) {if(recognizer.acceptWaveForm(audioData, audioData.length)) {returnrecognizer.getResult();} else{return recognizer.getPartialResult();}} }``` ###相关问题1.如何解决Vosk在Windows上加载本地库的问题?2.如何优化Vosk的实时音频流识别性能? 3.如何动态更新关键词和敏感词库? 4. Vosk支持哪些音频格式?如何转换音频格式以符合Vosk要求?[^1]:关于依赖未找到的问题,可以参考Maven官方文档:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html[^2]:JitPack的使用文档:https://jitpack.io/ [^3]: Vosk的GitHub仓库:https://github.com/alphacep/vosk-api</think>## 解决 Spring Boot 项目中 `com.alphacephei:vosk:0.3.45` 依赖未找到问题 Vosk 是一个优秀的离线语音识别库,但由于它不在 Maven 中央仓库中,需要特殊处理才能引入 Spring Boot 项目。以下是完整的解决方案: ### 解决方案 1:手动安装到本地 Maven 仓库(推荐) #### 步骤 1:下载 Vosk JAR 文件 从 [Vosk GitHub 发布页](https://github.com/alphacep/vosk-api/releases) 下载: ```bash wget https://github.com/alphacep/vosk-api/releases/download/v0.3.45/vosk-0.3.45-java.jar ``` #### 步骤 2:安装到本地 Maven 仓库 ```bash mvn install:install-file \ -Dfile=vosk-0.3.45-java.jar \ -DgroupId=com.alphacephei \ -DartifactId=vosk \ -Dversion=0.3.45 \ -Dpackaging=jar \ -DgeneratePom=true ``` #### 步骤 3:在 `pom.xml` 中添加依赖 ```xml <dependency> <groupId>com.alphacephei</groupId> <artifactId>vosk</artifactId> <version>0.3.45</version> </dependency> ``` ### 解决方案 2:使用 JitPack 仓库 #### 步骤 1:在 `pom.xml` 中添加 JitPack 仓库 ```xml <repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories> ``` #### 步骤 2:添加 Vosk 依赖 ```xml <dependency> <groupId>com.github.alphacep</groupId> <artifactId>vosk-api</artifactId> <version>v0.3.45</version> <classifier>java</classifier> </dependency> ``` ### 验证依赖是否生效 在项目中创建测试类: ```java import org.vosk.Model; public class VoskTest { public static void main(String[] args) { try { // 尝试加载模型(需要先下载模型) Model model = new Model("path/to/vosk-model"); System.out.println("✅ Vosk 依赖加载成功!"); } catch (Exception e) { System.err.println("❌ Vosk 依赖加载失败: " + e.getMessage()); } } } ``` ### 常见问题解决 1. **`UnsatisfiedLinkError` 错误(本地库缺失)** ```bash # 下载对应平台的本地库 wget https://github.com/alphacep/vosk-api/releases/download/v0.3.45/vosk-linux-x86_64-0.3.45.zip # 解压到项目目录 unzip vosk-linux-x86_64-0.3.45.zip -d src/main/resources/lib ``` 在启动脚本中添加: ```bash java -Djava.library.path=src/main/resources/lib -jar your-app.jar ``` 2. **模型加载失败** - 从 [Vosk 模型库](https://alphacephei.com/vosk/models) 下载中文模型: ```bash wget https://alphacephei.com/vosk/models/vosk-model-cn-0.22.zip unzip vosk-model-cn-0.22.zip -d src/main/resources/models/ ``` 3. **IDE 中仍显示依赖错误** - 在 IntelliJ IDEA 中: 1. 右键点击项目 > Maven > Reimport 2. File > Invalidate Caches / Restart - 在 Eclipse 中: 1. 右键项目 > Maven > Update Project 2. 勾选 "Force Update of Snapshots/Releases" ### 完整语音识别实现示例 ```java @Service public class SpeechRecognitionService { private Recognizer recognizer; @PostConstruct public void init() throws IOException { // 加载模型(确保路径正确) Model model = new Model("src/main/resources/models/vosk-model-cn-0.22"); recognizer = new Recognizer(model, 16000.0f); } public String recognize(byte[] audioData) { if (recognizer.acceptWaveForm(audioData, audioData.length)) { return recognizer.getResult(); } return recognizer.getPartialResult(); } } ``` ### 相关问题 1. 如何解决 Vosk 在 Windows 上的本地库加载问题? 2. 如何优化 Vosk 的实时音频流识别性能? 3. Vosk 支持哪些音频格式?如何转换音频格式? 4. 如何动态更新关键词和敏感词库? 5. 如何将识别结果实时推送到前端? > 提示:Vosk 官方文档提供了详细的 API 参考和示例代码,建议访问 [Vosk GitHub 仓库](https://github.com/alphacep/vosk-api) 获取最新信息[^1]。 [^1]: Vosk 官方 GitHub 仓库:https://github.com/alphacep/vosk-api
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值