getenv JNI library not found. Env.getenv will not work error

本文介绍了解决TinyOS Java串口接收数据时出现的环境变量配置错误问题。通过修改系统的环境变量path设置,确保指向正确的JDK安装路径,解决了tinyos自带Java程序的运行错误。

前几天在使用tinyos自带的java串口接收数据程序的时候出现了标题这个错误。2天之后终于解决,现在记录如下,为其他碰到类似问题的朋友们做个参考。

$java net.tinyos.tools PrintfClient -comm serial@COM4:telosb

会得到一个error:

 

getenv JNI library not found. Env.getenv will not work error

 

这时候你就要使用$which java看看,如果得到 "/cygwin/c/windows/system32/java",说明有问题,正确的结果是“/cygwin/c/program files/java/jdk/1.6/bin/java”.

 

解决方法,如果你的操作系统是win xp/2000,在我的电脑-》属性->高级->环境变量->path变量值的最前面增加c:/program files/java/jdk/1.6/bin,记住,一定是在最前面。

然后,再使用$which java 看看有什么变化。是不是变成“/cygwin/c/program files/java/jdk/1.6/bin/java”呢?

 

当然,如果你把java装在别的目录下,那就是其他目录了。但是,道理是一样的。

 

### Android MiSight JNI_OnLoad dlopen fail 问题原因及解决方法 在 Android 平台上,当使用 MiSight 库时出现 `JNI_OnLoad` 失败并伴随 `dlopen fail` 错误,通常与 native 库的加载机制、符号解析或 ABI 兼容性有关。Android 系统加载 JNI 库的方式主要有两种:一是通过 `JNI_OnLoad` 函数进行注册;二是如果没有定义 `JNI_OnLoad`,则系统会调用 `dvmResolveNativeMethod` 进行动态解析 [^1]。 #### 常见原因 1. **native 库未正确导出 JNI_OnLoad 函数** 若 native 库中未定义 `JNI_OnLoad` 函数,Android 虚拟机会尝试使用默认机制解析 JNI 方法。但在某些情况下,如使用了新版本的 JNI 函数,而没有指定 JNI 版本,则可能导致运行时错误,提示 "No JNI_OnLoad found" [^2]。 2. **ABI 不匹配** Android 支持多种 CPU 架构(如 armeabi-v7a、arm64-v8a、x86_64)。如果 MiSight 的 native 库仅支持特定 ABI,而应用尝试加载到不支持的设备上,会导致 `dlopen` 失败。 3. **native 库路径配置错误** 如果 native 库未放置在正确的目录下(如 `lib/armeabi-v7a/`),或未被正确打包进 APK 的 `lib/` 目录中,系统将无法找到并加载该库。 4. **依赖库缺失或版本不兼容** MiSight 库可能依赖其他 native 库(如 OpenCV、FFmpeg 等)。如果这些依赖库未正确打包或版本不匹配,也可能导致 `dlopen` 失败。 5. **权限或 SELinux 限制** 在某些 Android 版本或定制系统中,SELinux 或应用沙箱可能限制 native 库的加载,导致权限拒绝。 #### 解决方法 1. **确保 native 库包含 JNI_OnLoad 函数** 检查 MiSight native 库是否包含 `JNI_OnLoad` 函数,并在其中指定使用的 JNI 版本。例如: ```cpp jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { return -1; } // 注册 JNI 方法 if (!registerNativeMethods(env)) { return -1; } return JNI_VERSION_1_6; } ``` 该函数应返回正确的 JNI 版本,否则可能导致运行时错误 [^2]。 2. **验证 ABI 兼容性** 使用 `adb shell getprop ro.product.cpu.abi` 查看设备支持的 ABI,并确保 MiSight native 库包含对应 ABI 的版本。可在 `build.gradle` 中配置 ABI 过滤器: ```gradle android { defaultConfig { externalNativeBuild { cmake { abiFilters 'armeabi-v7a', 'arm64-v8a' } } } } ``` 3. **检查 native 库打包路径** 确保 native 库被打包进 APK 的 `lib/<ABI>/` 目录中。可使用 `aapt list <apk>` 命令查看 APK 中是否包含所需库文件。 4. **使用 `dlopen` 检查加载失败原因** 在 native 代码中使用 `dlopen` 和 `dlerror` 检查加载失败的具体原因: ```cpp void* handle = dlopen("libmisight.so", RTLD_LAZY); if (!handle) { const char* error = dlerror(); // 输出错误信息 } ``` 这有助于定位是路径问题、依赖缺失还是权限问题 [^3]。 5. **检查依赖库完整性** 使用 `readelf -d libmisight.so` 查看 native 库的依赖关系,并确保所有依赖库均已打包进 APK。 6. **启用 native 日志输出** 使用 `adb logcat` 捕获 native 日志,查看 `dlopen` 失败的具体信息: ```bash adb logcat -s System.err libc ``` 日志中可能会显示 `dlopen failed: library "libmisight.so" not found` 或 `dlopen failed: cannot locate symbol` 等提示。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值