Android4.4系统使用so文件提示No JNI_OnLoad found in /data/app-lib

本文探讨了在Android4.4与6.0系统中加载SO文件时出现的不同提示信息,尽管这些差异不影响实际使用。


在Android4.4系统上边运行app时,会提示以下信息

Trying to load lib /data/app-lib/xxx.connect.device-56/xxx.so 0x42a32012

Added shared lib /data/app-lib/xxx.connect.device-56/xxx.so 0x42a32012

No JNI_OnLoad found in /data/app-lib/xxx.connect.device-56/xxx.so 0x42a32012, skipping init


但在Android6.0系统上边则不会提示。

而且在两个系统上均可正常使用so文件,所以可以忽略此问题。

### JNI加载错误问题分析与解决方案 `java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad` 是JNI调用过程中常见的错误,通常发生在加载本地共享库(如`.so`文件)时。以下是对该问题的详细分析及解决方法。 #### 1. 错误原因分析 该错误可能由以下几种常见原因引起: - **架构不匹配**:如果应用程序运行在64Android系统上,但尝试加载32位的`.so`文件,会导致架构不兼容[^2]。 - **依赖缺失**:目标`.so`文件依赖其他动态库,但这些依赖未正确打包或部署到设备中[^1]。 - **JNI_OnLoad函数实现错误**:`JNI_OnLoad`函数返回值不正确(非`JNI_VERSION_1_6`等合法版本),导致加载失败[^3]。 - **路径问题**:`.so`文件未放置在正确的ABI目录下(如`armeabi-v7a`、`arm64-v8a`等),导致无法找到目标文件[^1]。 - **权限问题**:目标`.so`文件缺乏执行权限,或者应用没有足够的权限访问相关路径[^2]。 #### 2. 解决方案 以下是针对上述问题的具体解决方法: ##### 2.1 确保架构匹配 检查目标设备的CPU架构(如`arm64-v8a`),并确保编译生成的`.so`文件与之匹配。例如,对于64位设备,需要提供`arm64-v8a`版本的`.so`文件。可以通过以下代码检测当前设备的ABI支持列表: ```java String[]abis = Build.SUPPORTED_ABIS; for (String abi : abis) { Log.d("ABIS", "Supported ABI: " + abi); } ``` 将所有支持的ABI对应的`.so`文件放入`jniLibs`目录下的相应子目录中,例如: ``` src/main/jniLibs/arm64-v8a/libijksdl.so src/main/jniLibs/armeabi-v7a/libijksdl.so ``` ##### 2.2 检查依赖关系 使用工具(如`readelf`或`ldd`)检查`.so`文件的依赖项,确保所有依赖的动态库均已正确打包并部署到目标设备上。例如: ```bash readelf -d libijksdl.so | grep NEEDED ``` 如果发现缺失的依赖项,需将其添加到项目的`jniLibs`目录中,并重新构建APK。 ##### 2.3 验证JNI_OnLoad实现 确保`JNI_OnLoad`函数返回正确的JNI版本号。典型的实现如下: ```c JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) { return -1; // 返回错误 } return JNI_VERSION_1_6; // 返回正确的版本号 } ``` 如果`JNI_OnLoad`返回值不符合规范,可能导致加载失败。 ##### 2.4 确认文件路径 检查`.so`文件是否放置在正确的目录结构中。以`libijksdl.so`为例,应根据目标ABI分别放置在以下路径: ``` src/main/jniLibs/arm64-v8a/libijksdl.so src/main/jniLibs/armeabi-v7a/libijksdl.so ``` 同时,在代码中加载时,确保使用正确的路径或默认机制加载: ```java static { System.loadLibrary("ijksdl"); } ``` ##### 2.5 权限检查 确保应用具有读取执行`.so`文件的权限。可以在`AndroidManifest.xml`中添加以下权限声明: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> ``` 此外,确认`.so`文件的权限设置正确(如`rwxr-xr-x`)。 #### 3. 调试建议 - 使用日志记录具体的加载路径错误信息,便于定位问题。 - 在开发环境中启用NDK调试功能,捕获更多细节。 - 如果问题仅出现在特定设备上,考虑是否存在硬件或系统版本差异。 --- ### 示例代码 以下是一个完整的JNI加载示例,确保路径依赖正确: ```java public class NativeLoader { static { try { System.loadLibrary("ijksdl"); } catch (UnsatisfiedLinkError e) { Log.e("NativeLoader", "Failed to load library: " + e.getMessage()); } } public native String getNativeString(); } ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值