JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法

混淆编译造成 java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in “/data/app-lib/xx/xx.so” android app运行的时候偶尔会遇到加载so文件的问题,譬如java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app-lib/xxx/xxx.so" 今天遇到这种问题时,我按照网上的资料进行如下检查: 检查对应编译目录lib下有没有对应so文件; 检查对应module下的 build.gradle 没有如下条件 sourceSets { main { jniLibs. 阅读详情

昨天拿到JNI的Android工程Demo,然后把demo整合到开发的主线工程上,发现调用JNI方法一直抛同一个异常

java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()

我以为是JNI的so库有问题,但是demo运行时正常的,我无法找到原因的所在。我可以确认的我自己的问题,今天上午问到另外一个写C的同事,向他描述了我的情况。然后他问我是不是包名不一致的原因,我恍然大悟。确实在我移植到主线上的工程时,将定于调用JNI的包名改掉了。而so库在编译的时候,是有指定调用的包名的,这个就可以解释为何demo运行正常。只需要保证android工程调用JNI的包名与so库定义的包名类名方法名一致就可以了。

下面简单介绍一下JNI的 .h文件的内容

#ifndef _Included_packagename_classname   //packagename 指的是android工程中的包名 classname指的是android工程中定义JNI的类,该类包含调用JNI的方法
#define _Included_packagename_classname
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     packagename_classname
 * Method:    methodName
 */
JNIEXPORT jint JNICALL Java_packagename_classname_methodname();  // jint 指的返回数据类型为int,JNICALL 后面指定了调用JNI方法的包名和类名、方法名...
JNI的 .c文件格式如下

#include "packagename_classname.h"  // 这个是指的定义.h文件的命名,必须与.h文件的命名一致
#include <stdio.h>

#include "../../../src/classname.h"  // 包含src目录下定义的.h文件

#include <android/log.h>
static char *tag = "logtag_jni"; // 定义打印log的标签

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO   , tag, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN   , tag, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , tag, __VA_ARGS__)
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, tag, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG  , tag, __VA_ARGS__)

/*
 * Class:     packagename_classname
 * Method:    methodName
 */
JNIEXPORT jint JNICALL Java_packagename_classname_methodName(){...}

......
}

了解这些,帮助理解JNI就容易多了

Android之java.lang.UnsatisfiedLinkError(Failed to register native method ***callMethod1())解决办法 1、问题 Failed to register native method com.example.chenyu.test.JniClient.callMethod1() java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.example.chenyu.test-2 阅读详情

相关推荐

通俗易通解释SLAM问题的数学描述:运动方程和观测方程

高翔博士在他的《视觉SLAM十四讲》中把SLAM问题的数学描述抽象成了两个数学方程,以下对此做个总结,并且对此做一些通俗易懂的解释: 一、方程的总体形式 作为理性层次的描述,我们引入数学方程来描述SLAM过程,其中第一个方程叫做运动方程、第二个方程叫做观测方程,想象一下我们在研究SLAM的时候肯定需要观测机器人(无人汽车、无人机等都可以统称为机器人)的运动(画面感很强哈哈),这样很容易理解并且记忆这两个方程的名称和意义: 二、变量的含义 我们看到,这两个方程中有大量的英文字母作为变量存在其中,下面介绍一下

weixin_41855010的博客 7108

java+整合handwrite_解决java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad

我们在加载JNI的.so库的时候,Android Studio报类的错误“java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad”,该如何解决呢?具体错误内容如下:java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/co...

weixin_42294133的博客 1848

数字IC后端实现 | Innovus各个阶段常用命令汇总

数字IC后端设计实现之Innovus常用命令汇总

weixin_37584728的博客 7312

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad错误的解决

困扰了我一天的一个问题,显示一个so文件报找不到,后来是图上的错误。让我误以为第一个so文件是读到了的。 先简单讲下个人对android项目引入so文件的原理性的理解,知道了这个原理其实就不难查出问题。 1.首先so文件是一个native方法的实现。我们都知道Android的架构,我们编写的应用程序都是在应用层展示的,那么怎么调用更底层的东西呢,比如说应用框架层。那就要依靠native方法...

ruizhenggang的博客 2万+

【论文速读】MLDT:基于开源大语言模型的复杂长时机器人任务规划多层次分解方法

—在数据驱动的人工智能技术领域,开源大语言模型(LLMs)在机器人任务规划中的应用是一个重要的里程碑。近期基于开源大语言模型的机器人任务规划方法通常利用大量的任务规划数据集来提升模型的规划能力。虽然这些方法展现出了一定的前景,但它们在处理复杂长时任务时存在困难,因为这类任务需要理解更多的上下文信息并生成更长的动作序列。本文提出多层次分解任务规划方法(MLDT)来解决这一局限性。该方法创新性地在目标级、任务级和动作级对任务进行分解,以应对复杂长时任务带来的挑战。

muyulingfengye的博客 1642

STM32H743实战(三)-- 时钟系统配置

本文详细讲解了STM32H743时钟系统的配置方法,重点解析了为何选择400MHz而非理论极限480MHz作为稳定运行的主频。通过STM32CubeIDE环境,手把手指导如何从外部晶振配置、电源电压设置到PLL锁相环参数调整,最终实现稳定可靠的400MHz系统时钟,并提供了代码验证与常见问题排查指南。

weixin_29164185的博客 367

【android】 java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad错误的解决

使用JNI调用so的时候出现错误 这是由于没法调用到so。 1.确认在moudle中的gradle写入了 sourceSets { main { jniLibs.srcDirs = ['libs'] } } 2.调用So的类的包名必需要和so规定的包名一致,不然没法调用成功。java ...

了解—学习—进步—满足 3847

ML307R OpenCPU TCP使用

实现现象 平台下发数据,板子在收到数据之后,马上再发送到平台,通过串口助手可以看到已经接收到数据。ML307R TCP 是使用LWIP的标准的socket通信,具体TCP流程可以自行百度。实验目的:实现把接收的数据再发送到服务端。因为是4G,所以必须用外网的。

面朝大海春暖花开 2232

so文件无法加载

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/**/lib/arm/***.so" 造成问题的可能原因: 1、对应.so文件对应的类,可能被混淆了,造成C/C++中的代码找不到对应的Java类; 2、没有对应的ndk; ...

zhanglei892721的博客 1144

华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】

如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。

MISAYAONE的博客 1万+

Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」

本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。

blues_C的博客 1844

【Java报错已解决】java.lang.UnsatisfiedLinkError

在Java开发的世界里,我们时常会遇到各种各样的报错,其中java.lang.UnsatisfiedLinkError就像一个隐藏在暗处的幽灵,常常让开发者和环境配置者们感到困惑和无奈。这个错误一旦出现,可能会使我们精心编写的Java程序戛然而止,严重影响项目的开发进度和稳定性。那么,这个神秘的UnsatisfiedLinkError究竟是如何产生的?又该如何有效地解决它呢?让我们一起深入探究这个恼人的报错问题。

鸽芷咕的博客 7702

【AI Guide】AI面试攻略只用看这一篇就够了!力争做全网最全的AI面试攻略——大模型(五)Adapter 微调

Adapter 微调(Adapter Fine-tuning)是一种高效的参数高效微调(PEFT)方法。相较于全参数微调(Full Fine-tuning),Adapter 在预训练模型的特定层插入轻量级的可训练模块,而冻结原始模型参数,从而减少计算和存储开销。是缩放因子,控制 Adapter 输出的影响程度。设 Transformer 层的隐藏状态为。为 Adapter 层的可训练参数,为非线性激活函数,如 ReLU。为冻结的预训练模型参数,

AI科研社 182

android引入.so报错

注意厂家提供的.so和一些java文件包名不能更改,更改的话会报这个错误

亚洲程序员盟主得博客 4699

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android源码编译JNI遇到的问题与解决方法

这些问题是都是坑,有的问题晚上都找不到解决方法,是因为这些问题只要用到源码编译的时候才会遇到,这里我用的是源码编译。 问题如下;问题1.dlopen(“/data/app/xxx.xxx.so”)failed,dlopen”/data/app/xxx.xxx.so” has unexcepted e_machine 40 解决方法:这里是因为模拟器的cpu和编译出来的.so文件的平台不一样,这里

JianYeung的博客 2969

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java.lang.UnsatisfiedLinkError异常的正确处理方法,亲测有效,嘿嘿嘿

`java.lang.UnsatisfiedLinkError` 异常通常在 Java 应用程序尝试调用本地方法(即使用 Java Native Interface, JNI)时发生,但无法找到相应的本地库(`.dll` 在 Windows 上,`.so` 在 Unix-like 系统上,或 `.dylib` 在 macOS 上)或无法解析库中的特定函数时抛出。 ### 问题分析 `UnsatisfiedLinkError` 异常通常表明 Java 虚拟机(JVM)无法找到或加载所需的本地库。这可能是由

PythonAigc的博客 3487

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JNI报错:java.lang.UnsatisfiedLinkError

当使用 JNI 从 Java 程序访问本机代码时,您会遇到许多问题。您会遇到的三个最常见的错误是:   1.无法找到动态链接。它所产生的错误消息是:java.lang.UnsatisfiedLinkError。这通常指无法找到共享库,或者无法找到共享库内特定的本机方法。     2.无法找到共享库文件。当用 System.loadLibrary(String libname) 方法(参...

Curiosity 1434

Java调用本地接口:java.lang.UnsatisfiedLinkError:包名.类.方法(参数)

    最近在工作中需要调用第三方的接口,使用JNI去调用。但是在调用过程中,就出现了上面的异常,于是乎各种查找资料,终于 功夫不负有心人,终于找到了解决的办法。    其实Jni就是我们将Java的class文件编译成c的.h文件,之后根据头文件来编写源文件。所以这个过程中就会有相对应和一致的要求,我想你可能已经猜到了,就是类的包路径要和生成头文件类包路径一致。否则不是找不到方法,就是实例化不了...

qq_37687656的博客 1万+

java.lang.unsatisfiedlinkerror解决方法

有时候我们接入第三方sdk的时候,同时导入了一些so库。 编译运行后发生会报以下异常。java.lang.unsatisfiedlinkerror。    解决方法 在主工程app的build.gradle中加入以下代码。作用是指定so库的位置。 android { ............ sourceSets{ main{

adojayfan的博客 4433

Java.lang.UnsatisfiedLinkError解决办法

在用JNI编程时,经常会遇到Java.lang.UnsatisfiedLinkError这种报错。先排除xx.so文件在程序中的连接问题,确定工程可以找到xx.so文件。一般报此错误,大多是由于函数接口不对,使用如下命令sudo readelf -Ws libxx.so >> test.log把xx.so文件中的内容dump到test.log文件中,在test.log文件中可以看到所有函数的内容,

少年~学习啦 6449

关于jni调用报UnsatisfiedLinkError的可能

一、说明 最近在做一个项目,需要使用java去调本地动态连接库,之前做测试的时候直接用pojo进行测试,是能够正常调用的。后面项目需要将接口封装为REST api,所以在spring boot上面开发,但是同一个调用,在spring上面就出现问题了。 二、解决 先确保将dll文件放置到指定的地方,可以参考:https://bbs.csdn.net/wap/topics/38005381...

weixin_30279315的博客 766
上一篇: Android 使用新浪微博SSO授权
下一篇: Conversion to Dalvik format failed with error 1 解决办法
hap_gx
博客等级 码龄14年 6粉丝 23原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值