Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android的NDK开发中的UnsatisfiedLinkError

Android的NDK开发中的UnsatisfiedLinkError

作者头像
NaOH
发布于 2018-05-29 03:40:04
发布于 2018-05-29 03:40:04
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

首先UnsatisfiedLinkError的种类很多,我这里遇到的是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.UnsatisfiedLinkError:
nativeLibraryDirectories=[*****/lib/arm64, *****/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libmytool.so"

可以看到我这里主要是因为在这几个文件夹中都没有找到我的so库导致的。 仔细一看,我的jniLibs中确实只有一个armeabi-v7文件夹,于是我添加了如下的文件夹:

然后在各个文件夹中,都把我的so文件放了一份。 但是直接跑,发现它提示我的so文件是一个32bit的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 java.lang.UnsatisfiedLinkError: dlopen failed: "****/lib/arm64/libmytool.so" is 32-bit instead of 64-bit

经过下面两篇文章的指导:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://stackoverflow.com/questions/27186243/use-32-bit-jni-libraries-on-64-bit-android
https://corbt.com/posts/2015/09/18/mixing-32-and-64bit-dependencies-in-android.html

我在build.gradle中添加了下面的部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"

defaultConfig {
    ……
    ndk {
        abiFilters "armeabi-v7a", "x86"(后面还可以加其他的,但是我这里只加了x86就可以跑了)
    }
}
buildTypes {
    ……
}
sourceSets.main {
    jni.srcDirs = ['src/main/jni','src/main/jniLibs']
    //这个地方也是一个容易出错的地方,虽然默认的jni目录是'src/main/jni',但是so文件直接放进去经常会出错,一般会在jni中放c文件,然后在同级目录下创建一个jniLibs文件夹用于放so库
}

} 可以看到,在我加了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ndk {
        abiFilters "armeabi-v7a", "x86"(后面还可以加其他的,但是我这里只加了x86就可以跑了)
    }

之后,等于对原来的jni中的文件夹做了一个筛选,只选入了这里标识的"armeabi-v7a"和"x86",所以不会再导入arm64中的文件,因此也不会出错了(arm64中的自然都应该是64位的库,而"armeabi-v7a"和"x86"则可以是32位的)

不过我还是很疑惑,为什么这个破手机提示我在下面的文件夹中没有找到so库,然而我加的文件夹是x86啊,跟这些文件夹也搭不上关系…不知道为啥就能跑起来了。我感觉,嗯,很奇葩。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*****/lib/arm64, *****/lib/arm64-v8a, /vendor/lib64, /system/lib64]]

注:笔者当时用的是某菊花场的手机进行的测试…算了不提了…

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年08月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
探密 C++ STL — 深入理解 Stack 和 Queue 的实现与应用
在计算机科学中,数据结构是存储和组织数据的方式,使得我们可以高效地进行数据的访问和修改。在众多数据结构中,stack(栈)和 queue(队列)是两种非常基础且广泛应用的线性数据结构。C++ 提供了非常方便的标准库(STL)来实现 stack 和 queue,并且它们被广泛应用于各种算法和解决方案中。
用户11289931
2024/11/24
2230
【C++】 世界里的 “秩序双雄”:stack 和 queue !把 stack 想象成时光回溯胶囊,新记忆后入先取;queue 仿若忙碌流水线,任务依次稳步推进。
下面,栈为空,返回的就是true就是1,如果有元素入栈,那就是不为空,返回false就是0.
逆向-落叶
2024/12/29
1020
【C++】 世界里的 “秩序双雄”:stack 和 queue !把 stack 想象成时光回溯胶囊,新记忆后入先取;queue 仿若忙碌流水线,任务依次稳步推进。
(超级清晰带链接)STL--stack与queue(deque)--C++
从栈的接口中可以看出,栈实际是一种特殊的vector,因此使用vector完全可以模拟实现stack。具体实现如下:
小志biubiu
2025/02/27
960
(超级清晰带链接)STL--stack与queue(deque)--C++
C++ Stack和Queue---单向守护与无尽等待:数据结构的诗意表达
容器适配器(Container Adapter)是C++标准模板库(STL)中的一种设计模式,专门用于提供一种经过简化和限制的接口,使得不同的容器类型可以表现出类似的行为。容器适配器不会创建新的容器,而是基于已有的容器(如 deque、vector 等)进行包装,以改变或限制其接口,从而提供不同的行为和使用方式。
Undoom
2024/11/21
1040
C++ Stack和Queue---单向守护与无尽等待:数据结构的诗意表达
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——8.stack&&queue&&priority_queue(无习题)
C++ 标准模板库(STL)提供了一系列容器,其中 stack 和 queue 是两种常用的适配器容器。它们基于底层的序列容器(如 vector、deque)实现,分别用于支持栈和队列的操作模型。栈(stack)遵循“后进先出”(LIFO)的原则,而队列(queue)遵循“先进先出”(FIFO)的原则。本文将详细介绍这两种容器的特点、使用方法、实现机制及其应用场景。
hope kc
2024/10/24
1760
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
前言: 在编程的世界里,数据结构是构建高效、可靠程序的基础。它们就像是我们编程工具箱中的精密工具,帮助我们解决各种复杂的问题。而在C++的STL中,栈(Stack)和队列(Queue)是两种非常重要的数据结构,它们以不同的方式管理和操作数据,为我们的程序提供了极大的灵活性
Eternity._
2024/06/14
4610
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
C++第十四弹 -- STL之queue和priority_queue深度剖析
打开C++文档介绍, 我们可以发现< queue >头文件中包含了两种容器适配器类, 我们先来看queue.
用户11317877
2024/10/16
1150
C++第十四弹 -- STL之queue和priority_queue深度剖析
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque。
秦jh
2024/06/12
2530
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
【C++】stack & queue
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成我们希望的另外一个接口。
YoungMLet
2024/03/01
1170
【C++】stack & queue
【stack】【queue】【priority_queue】【deque】详解
通过观察文档我们不难发现,接口相较于之前的 string、vector 和 list 少了很多。它甚至连拷贝构造和析构都没有自己实现,然而这些都得益于容器适配器的使用。
利刃大大
2023/04/12
9940
【C++】STL--priority_queue和queue
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元 素,另一端提取元素。
用户11375356
2024/11/22
890
【C++】STL--priority_queue和queue
C++效率掌握之STL库:优先级队列priority_queue && 双端队列deque
优先级队列默认使用 vector 作为其底层存储数据的容器,在 vector 上又使用了堆算法将vector 中元素构造成堆的结构,因此 priority_queue 就是堆,所有需要用到堆的位置,都可以考虑使用 priority_queue
DARLING Zero two
2025/03/29
1390
C++效率掌握之STL库:优先级队列priority_queue && 双端队列deque
一文了解stack和queue类的实现
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。
海盗船长
2020/08/27
5630
C++初阶-stack/queue/priority_queue的使用和模拟
​ empty():检测容器是否为空 ​ size():返回容器中有效元素个数 ​ front():返回容器中第一个元素的引用 ​ push_back():在容器尾部插入元素 ​ pop_back():删除容器尾部元素
用户9645905
2022/11/30
3390
C++初阶-stack/queue/priority_queue的使用和模拟
【c++】stack和queue使用 && stack和queue模拟实现
stack的文档介绍:https://cplusplus.com/reference/stack/stack/?kw=stack
用户10925563
2024/06/04
1450
【c++】stack和queue使用 && stack和queue模拟实现
stack和queue及优先级队列和适配器(包括deque)的介绍
其实在数据结构中我们学习了栈和队列后我们在C++部分中学习起来stack和queue就很容易上手了!
ahao
2024/03/19
1970
stack和queue及优先级队列和适配器(包括deque)的介绍
【C++】stack和queue
注:本文的学习是基于对于数据结构栈与队列、堆有一定基础上的,未学习相关知识的读者可以移步学习数据结构部分相关内容。
ZLRRLZ
2024/12/13
1760
【C++】stack和queue
【C++】stack和queue
解题思路: 这道题要求时间复杂度是O(1),我们可以定义两个栈,一个栈叫做st,一个栈叫做minst,当st中插入5时minst中也插入5,当 st 中插入4时,minst 也插入4,当st中插入6时,此时 minst 中不用做更新了,因为没有插入更小的值。此时 st 中删除与 minst中相同的值,minst 就跟着删,否则minst不动。 代码实现:
_孙同学
2025/04/09
1060
【C++】stack和queue
[C++] 容器适配器:深入理解Stack与Queue的底层原理
本文所涉及的stack、queue和priority_queue都是容器适配器,在底层都可以通过在接口传入的容器类型来进行底层的容器实现。
DevKevin
2024/08/02
2670
[C++] 容器适配器:深入理解Stack与Queue的底层原理
C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现
如你所见,尽管栈适配器的底层容器可能是vector,但它提供了与vector不同的操作接口。栈适配器隐藏了vector的细节,只暴露了栈的相关操作,使得我们可以更方便地使用栈这种数据结构。
是Nero哦
2024/02/19
2560
C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现
推荐阅读
相关推荐
探密 C++ STL — 深入理解 Stack 和 Queue 的实现与应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验