cannot resolve corresponding JNI function

本文提供了一种有效解决AndroidStudio中JNI警告的方法,避免了C++/C编码提示及源码调试功能失效的问题。通过调整偏好设置,取消MissingJNIfunction检查,使开发环境恢复正常。

原文:

https://blog.youkuaiyun.com/LIANGJIANGLI/article/details/72779342

 

对于网上千篇一律的解决办法就是 扯淡!!虽然可以解决红色消失,但是C++/C编码提示、查看源码调试功能都用不了,头痛医脚!!!
错误用法:1.File--->Settings--->Plugins,将Android NDK Support后面的对勾去掉,重新启动Android Studio

 

下面来演示正确解决方法:

搜索还是要用google,百度都是拷贝的多,没啥实际意义。翻译大概意思就是说:Android Studio正在尝试解决JNI的功能,因为它将和Android项目不同,因此它将会给出这些错误的错误。如果这样会变得烦人,可以通过转到Preferences > Editor > Inspections(这个是mac,windows的应该是File>Setting>Editor>Inspections)来选择要进行更改的配置文件,搜索“JNI”并取消选中"Missing JNI function"。

完美解决!!!

 

您遇到的错误信息如下: ``` Cannot resolve corresponding JNI function Java_com_isa_navi_jni_hmi_HmiProxyJNI_get_1Global_1m_1catch_1address. ``` 这个错误表明 **Java 层尝试调用一个 native 方法时,JVM 无法找到对应的 C/C++ JNI 函数实现**。 --- ### ✅ 错误原因分析 错误中的函数名是: ``` Java_com_isa_navi_jni_hmi_HmiProxyJNI_get_1Global_1m_1catch_1address ``` 注意其中的 `_1`,这是 JNI 对 Java 方法名中 **下划线 `_`** 的转义表示。 这意味着: - Java native 方法名中包含下划线(例如 `get_Global_m_catch_address`)。 - JVM 在查找对应的 JNI 函数时,期望函数名中使用 `_1` 替代每个 `_`。 - 但实际编译的 `.so` 文件中,可能没有这个符号,或者函数名不匹配。 --- ### ✅ 检查点与解决方案 #### ✅ 1. 确认 Java 层 native 方法声明 ```java public class HmiProxyJNI { static { System.loadLibrary("your_native_lib"); } public native String get_Global_m_catch_address(); // 方法名含下划线 } ``` #### ✅ 2. 确保 C/C++ 中有对应的 JNI 函数名 Java 方法名:`get_Global_m_catch_address` JNI 函数名应为: ```cpp extern "C" JNIEXPORT jstring JNICALL Java_com_isa_navi_jni_hmi_HmiProxyJNI_get_1Global_1m_1catch_1address(JNIEnv* env, jobject thiz) { std::string address = Update::get_Global_m_data_address(); return env->NewStringUTF(address.c_str()); } ``` > ⚠️ 注意函数名中所有 `_` 都被替换为 `_1`。 --- ### ✅ 排查步骤 | 检查项 | 说明 | |--------|------| | ✅ **函数名是否匹配** | Java 方法名和 C/C++ JNI 函数名是否一致(注意 `_` 转义为 `_1`) | | ✅ **包路径是否正确** | JNI 函数中的包路径 `com_isa_navi_jni_hmi` 是否与 Java 层一致 | | ✅ **native 方法是否已加载** | 检查 `System.loadLibrary(...)` 是否成功执行 | | ✅ **动态库是否包含该函数** | 使用 `nm` 或 `readelf` 检查 `.so` 文件是否包含该符号 | | ✅ **是否使用了正确的编译器标志** | 如 `extern "C"` 防止 C++ 名称混淆 | --- ### ✅ 使用 `nm` 检查 `.so` 文件是否包含函数 ```bash nm libyour_native_lib.so | grep Java_com_isa_navi_jni_hmi_HmiProxyJNI_get_1Global_1m_1catch_1address ``` 如果找不到该符号,说明: - 函数未被正确导出 - 或函数名拼写错误 - 或未包含在构建目标中 --- ### ✅ 示例完整代码 #### Java 层 ```java public class HmiProxyJNI { static { System.loadLibrary("your_native_lib"); } public native String get_Global_m_catch_address(); } ``` #### C++ 层 ```cpp extern "C" JNIEXPORT jstring JNICALL Java_com_isa_navi_jni_hmi_HmiProxyJNI_get_1Global_1m_1catch_1address(JNIEnv* env, jobject thiz) { std::string address = Update::get_Global_m_data_address(); return env->NewStringUTF(address.c_str()); } ``` --- ### ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|-----------| | JNI 函数找不到 | Java 方法名含 `_`,导致 JNI 函数名需转义为 `_1` | 确保函数名一致 | | 动态库未正确构建 | `.so` 文件中没有该函数 | 检查编译链接流程 | | 包名不一致 | JNI 函数包路径与 Java 不一致 | 核对完整类路径 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值