【Android】使用native开发遇到的bug---java.lang.UnsatisfiedLinkError: No implementation found for

今晚终于解决了一个困扰我三天的bug,就是这个java.lang.UnsatisfiedLinkError: No implementation found for,感觉人生达到了巅峰,特此记录下…

前几天老师给我一个项目,让我实现一个将视频下载到本地的功能,顺便给了我一个demo,让我先看看demo里的代码,打开demo的工程文件,费了好大劲才编译通过(AndroidStudio导入项目各种问题),在手机上一运行发现居然全是韩文,尝试着瞎点了几下发现没法运行,demo应该和实验室项目一样是一个播放监控录像的APP,但是没有摄像头的IP地址和账号密码没法使用,只好硬着头皮去看代码,结果那demo代码乱的不行,根本没有分类,所有的类、活动全在一个包里,打开主界面一看,5000+行代码…

无语。。。。。。。。。。。。。

只好挑重点的看,在所有类里发现一个Download类,这应该就是下载视频所用到的类,打开一看果然,把代码里的韩文翻译过来正是–视频下载吗?–确定–取消,心下一喜,顺着代码往下看,发现代码非常简单,就是去调用Java的native方法,传入要下载的开始时间和结束时间就可以了,于是开始在实验室项目里写,写完以后发现实验室的专门放所有native方法的类里并没有demo里下载视频的方法,觉得有点奇怪,这些native方法应该都是从demo里copy到实验室项目里来的,怎么会没有?想了想可能是因为之前写实验室项目的人用不到下载视频的方法,就给删除了,然后我就自己加上了下载视频和停止下载视频的方法,虽然知道希望不大,但还是尝试着运行了一下,果然,点击下载APP就崩溃了,查看logcat里的报错并没有什么有用的信息,应该是因为在真机上调试,崩溃后自动重启,新的错误将之前的覆盖了,只好转到模拟器上运行,点击下载崩溃以后,logcat提示了这个bug

java.lang.UnsatisfiedLinkError: No implementation found for......

去百度找原因,发现大家的原因全都是没有导入需要的so文件,或者导入方法不对,我把能试的方法都试过了但是并没有解决
https://blog.youkuaiyun.com/dreamme1/article/details/50351007
于是只好从底层找原因,但是native方法都是运行在linux上的,没法查看,去网上查了查native方法和so文件
so文件:https://www.jianshu.com/p/cb15ba69fa89
native:https://blog.youkuaiyun.com/dj673344908/article/details/82461418
实验室项目的so文件只有一个,但我又不知道如何打开so文件,百度后了解到,要使用linux查看so文件,刚好前几天在做操作系统实验,电脑上还有linux虚拟机,将so文件导入到linux虚拟机后
使用 nm -D ***.so查看so文件里的接口,并没有下载视频时用到的那个方法。
好吧,这下问题不怪我了,是客户给的so文件有问题,到时候只好和老师这么说,觉得这个功能可能没法实现了。但是又总是不甘心,翻来覆去的想,demo里既然有下载视频的代码,总不可能跟我遇到的情况一样,一下载就闪退,那这个demo也太不合格了,然后开始佛学起来,把所有的参数都改了一下,发现demo里居然还有bug,本来开始时间和结束时间只相差1分钟,demo里计算出来的时间差居然多了一个月,那有没有可能是因为时间太长没法下载导致闪退呢,我把demo里的bug解决后,设置成只下载一分钟长度的视频,结果还是那个bug,依旧闪退,心灰意冷,打算关电脑上床睡觉,打算关掉linux虚拟机的时候忽然想到,会不会是demo里的so文件和实验室项目的so文件不一样,我打开demo的文件夹,找到so文件,大小是1755KB,然后打开实验室项目,找到so文件,发现大小是1740KB,居然是个阉割版的!!!!!
于是赶紧将demo里的so文件导入到linux虚拟机,用命令行打开后发现了下载视频时用到的函数,激动的不能自己,然后用demo里的so文件替换掉实验室项目里的so文件,rebuild后运行,logcat里不停的打印downloading…,程序也没有闪退,没一会就提示视频已下载到本地,激动的到文件夹一看,果然已经下载下来了,开心到爆炸!!!

		( •̀ ω •́ )耶!
在 Windows 系统下遇到 `java.lang.UnsatisfiedLinkError: no jacob-1.21-x64 in java.library.path` 异常,通常是由于 Java 无法找到 Jacob 的本地库(DLL 文件)导致的。要解决此问题,需确保 DLL 文件被正确放置在系统路径中,并且与当前运行的 JVM 架构一致。 以下为可行的解决方案: ### 1. 获取正确的 Jacob 版本 首先确认你使用的是适用于 64 位 JVM 的 `jacob-1.21-x64.dll` 文件。该文件通常可以从 Jacob 的官方发布或可信资源中获取。建议从源码编译或从已验证的第三方资源下载以确保兼容性和安全性 [^5]。 ### 2. 将 `jacob-1.21-x64.dll` 放入系统路径 将 `jacob-1.21-x64.dll` 文件复制到以下任意一个目录中,以便 Java 能够加载它: - `C:\Windows\System32`:适用于 64 位系统上的 64 位 JVM。 - `%JAVA_HOME%\bin` 或 `%JRE_HOME%\bin`:将 DLL 文件放入 JDK 或 JRE 的 bin 目录可以确保 JVM 在启动时加载该库 [^3]。 注意:如果使用的是 32 位 JVM,则应将 `jacob-1.21-x86.dll` 放入 `C:\Windows\SysWOW64` 目录。 ### 3. 配置项目依赖 将 `jacob.jar` 添加到项目的类路径中。可以通过以下方式实现: - 在 IDE(如 Eclipse、IntelliJ IDEA)中,将 `jacob.jar` 添加为外部库。 - 如果是命令行编译,使用 `-cp` 参数指定类路径: ```bash javac -cp .;path\to\jacob.jar YourClass.java java -cp .;path\to\jacob.jar YourClass ``` ### 4. 检查 JVM 架构与 DLL 匹配 确保所使用的 JVM 架构与 DLL 文件匹配。例如,64 位 JVM 必须使用 `x64` 版本的 DLL,而 32 位 JVM 使用 `x86` 版本。若不确定当前 JVM 是 32 位还是 64 位,可通过以下命令查看: ```bash java -version ``` 输出中包含 "64-Bit" 表示为 64 位 JVM [^2]。 ### 5. 设置 `java.library.path` 启动参数 可以在运行 Java 应用程序时通过 `-Djava.library.path` 明确指定 DLL 所在目录。例如: ```bash java -Djava.library.path=path\to\dll_directory -cp .;path\to\jacob.jar YourClass ``` ### 6. 重启开发工具或环境 如果你是在 Eclipse 等 IDE 中开发,修改了系统路径或 DLL 文件后,可能需要重新配置 JRE 并重启 IDE,以确保新设置生效 [^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值