关于java.lang.UnsatisfiedLinkError: Native method not found: com.ishow.scan.zbar.ZbarManager.decode:([...

本文详细描述了从Eclipse移植项目至Android Studio时,遇到.so库引用问题的解决过程,包括更改包名以匹配Android.mk文件中的包名、重新编译并成功运行项目的步骤。

原来用过Zxing来做二维码扫描,现在因为在某些机型上出现了崩溃,实在不知道是为什么,所以现在需要尝试用zBar来实现二维码扫描。

在Eclipse上做好了一个Demo,比较简单,果然,zBar比zXing扫描速度也快了很多,也没有出现崩溃。

现在要把项目移植到Android Studio 上,这里讲一下Android Studio 引入 .so库的方法。

在main下新建一个jniLibs文件夹,将库文件放进入

之后要在.gragle文件中的android{}中加入这样一段引用
 
好了把改移植都移植完了,我运行一下
java.lang.UnsatisfiedLinkError: Native method not found: com.ishow.scan.zbar.ZbarManager.decode:([BIIZIIII)Ljava/lang/String;
 
给我报这个,我明明引用了SO库啊,怎么会找不到。
之后左搞右搞都不行,弄得我都怀疑人生了,我一直都在找我的so库是哪里引错了。
最后实在没有办法,回到Eclipse新建了个项目试试移植一下怎么样。
 
java.lang.UnsatisfiedLinkError: Native method not found: com.ishow.scan.zbar.ZbarManager.decode:([BIIZIIII)Ljava/lang/String;
尼玛,日了够了,瞬间凌乱了。Eclipse也找不到了。
 
之后想想应该是自己哪里弄错了,不然不会两个都不行,工具肯定是没问题,不然没理由两个都错。
 
之后再网上翻了半天,才发现
 
包名不能变,一定要和Android.mk文件中的包名要相同。
 
之后我换了包名
 
运行,问题解决。
 
这日的搞了我一下午。
 
 

转载于:https://www.cnblogs.com/fangwang/p/4956610.html

### 解决 `UnsatisfiedLinkError` 错误 当遇到 `java.lang.UnsatisfiedLinkError: dlopen failed: library "libdsd_decoder.so" not found` 这样的错误时,通常意味着应用程序尝试加载的本地库未能成功找到。这可能是由于多种原因引起的。 #### 库路径配置不当 如果 `.so` 文件未放置在正确的位置,则可能导致此问题。对于 Android 项目而言,`.so` 文件应当位于特定目录结构下以便 Gradle 能够识别并打包这些资源到 APK 中[^4]。 ```plaintext app/src/main/jniLibs/ ├── arm64-v8a/ │ └── libdsd_decoder.so ├── armeabi-v7a/ │ ┗── libdsd_decoder.so └── ... ``` #### 缺失依赖项 有时目标共享对象文件可能还依赖于其他动态链接库。假如缺少任何一个必需的辅助库也会引发同样的异常情况。因此确认所有必要的支持库都已妥善处理非常重要[^2]。 #### CMakeLists.txt 设置不全 假设使用的是 CMake 构建工具链,在 `CMakeLists.txt` 文件里应该指定好要连接哪些外部二进制组件。确保已经包含了如下类似的指令来关联所需的第三方静态或动态库: ```cmake add_library(dsd_decoder SHARED IMPORTED) set_target_properties(dsd_decoder PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libdsd_decoder.so) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/) target_link_libraries(your_native_lib dsd_decoder ...) ``` #### 动态加载顺序不对 某些情况下多个原生接口之间存在先后次序关系。比如 FFmpeg 的各个模块就需要按照一定规则依次引入才能正常工作[^5]。所以建议调整加载语句使之遵循合理的逻辑序列: ```java static { System.loadLibrary("c++"); // 如果有C++标准库的话先载入它 System.loadLibrary("other_dependency"); System.loadLibrary("dsd_decoder"); } ``` 通过以上措施可以有效减少甚至消除此类运行期崩溃现象的发生概率。当然具体实施还需结合实际开发环境和个人需求灵活运用上述方法论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值