首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态库的适配

的 sdk 情况下编译,可以运行正常,不存在闪退或者 .so 库加载失败的情况,当你采用 api >=23 的sdk 编译的时候,安装到 Android 6.0 及其以上的手机的时候,大范围出现崩溃...或者 .so 库加载失败,而在 6.0 以下的手机却正常;     Catch的信息:dlopen failed: cannot locate symbol "XXXX" xxxx.so, XX 是泛配...现在我用一句话说白它,就是:不同链接方式时,dlopen会打开指定的系统中(手机中)或提供的动态库,并使用 dlsym 获取符号地址,也就是说,如果,在此时的手机中如果找不到,那么就会出问题,一般和 API...并使用 dlsym 获取符号地址,也就是说,如果,在此时的手机中如果找不到,那么就会出问题,一般和 API 有关系。...,要么采用第一种,建议尝试,APP_STL := gnustl_shared,   这种方式,对于所需要的外部动态链接函数、符号,在 NDK 13b 中都会独立生成一份,全部引用就解决此类问题,例如 1

2K100

深入Android源码系列(一)

编写一个调试: 这里Location指的是ndk-build脚本位置 Working Directory 指的是当前项目的src/jni,我们要使用ndk-build将jni目录下的android.mk...在此处,libname就是/data/app/com.example.jnidemo-2/lib/arm/libtest_jni.so,这个就是我们的jni动态库真正的位置了。...按照这个文档,去调试so(需要下载android的ndk) http://blog.csdn.net/kaiqiangzhang001/article/details/21108857 打上断点的截图为...这里android调用了android_dlopen_ext方法,来实现动态库的加载,返回dlextinfo,而非android的,则是调用dlopen加载的。...这里的--prefix-symbols=__dl_ 就是给名字的符号上面加入一个前缀,于是我们的android_dlopen_ext 就变成了__dl_android_dlopen_ext。

2.2K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    NDK开发_编译的cpp引用到 其它so, Android.mk 的写法

    如果我们编译的so文件需要引用到其它的so文件,那我们来看下这时候的Android.mk 文件如何写。...一、不需要ndk编译 .cpp,直接是 so文件 切到 Project 视图,在java同级目录下 新建 jniLibs文件夹,再根据平台需要,在jniLibs目录下建 armeabi-v7/x86 ....文件夹, 下面的截图 根据平台需要建的是armeabi-v7a文件夹,然后将相应的 so文件复制到该目录下即可。编译运行工程的后,相应的so就打包进apk了。 ?...二、需要ndk 编译.cpp, 编译的 .cpp 需要引用外部的 .so 如下图所示,ndk 编译 util.cpp,需要引用到 libyuv2rgb.so ,我们看下 Android.mk中的内容 ?...so 在 app/build/intermediates/ndk/ 目录下。

    1.2K20

    分享一个绕过移动端系统限制的增强版dlfunctions库

    Android 7以上dlopen, System.load都是被限制调用的,虽然目前网上有Nougat_dlfunctions等库通过从maps中找so库来绕过加载限制。...而byOpen不仅支持fake dlopen方式从maps加载,还可以将还没加载到maps的so库绕过系统限制强行加载进来使用,实现更加通用化的dlopen。...从而绕过Android N的classloader-namespace限制,将系统/system/lib中任意so库加载到maps中,然后再通过fake dlopen的方式去dlsym。...,顺带修复了里面的一些bug) 整个dlopen过程只有一次malloc分配(省去整个符号表的内存分配和copy) 兼容原始dlopen,如果是低版本android系统,没有限制,还是会优先切到原生dlopen...直接编译库 $ xmake f -p android --ndk=~/file/android-ndk-r20b $ xmake 通过gradle编译测试Apk $ cd src/android

    1.5K30

    so库你应该知道的基础知识

    Android应用支持的ABI取决于APK中位于lib/ABI目录中的.so文件,其中ABI可能是上面说过的七种ABI中的一种。...jni/ABI目录中(.so文件会自动包含到引用AAR压缩包的APK中) 最终APK文件中的lib/ABI目录中 通过PackageManager安装后,在小于Android 5.0的系统中,.so...//dlopen打开失败 java.lang.UnsatisfiedLinkError :findLibrary returned null //找不到library java.lang.UnsatisfiedLinkError...在Android系统中,当我们安装Apk文件的时候,lib目录下的so文件会被解压到App的原生库目录,一般来说是放到/data/data/package-name/lib目录下,当准备加载native...层的so时,虽然在Apk中有对应的so文件,但是由于手机设备没有足够的空间加载该so,导致加载失败,产生上述崩溃。

    11221

    关于so文件你需要知道的知识「建议收藏」

    Android应用支持的ABI取决于APK中位于lib/ABI目录中的.so文件,其中ABI可能是上面说过的七种ABI中的一种。.../ABI目录中(.so文件会自动包含到引用AAR压缩包的APK中) 最终APK文件中的lib/ABI目录中 通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app...因为只要出现了这个目录,系统就只会在这个目录里找.so文件而不会遍历其他的目录,所以就出现了找不到.so文件的情况。...//dlopen打开失败 java.lang.UnsatisfiedLinkError :findLibrary returned null //找不到library java.lang.UnsatisfiedLinkError...层的so时,虽然在Apk中有对应的so文件,但是由于手机设备没有足够的空间加载该so,导致加载失败,产生上述崩溃。

    2.9K10

    BreakPad模拟Android native崩溃

    平台 Native 代码的崩溃捕获机制及实现 的介绍,我们可知“Crash reason: SIGSEGV /SEGV_MAPERR”代表哪种类型的错误: SIGSEGV 是当一个进程执行了一个无效的内存引用...Thread 0 (crashed) //crash 发生时候的线程 0 libnative-lib.so + 0x325f4 //发生 crash 的位置和寄存器信息 有了具体的寄存器信息,我们进行符号解析...(注意CPU是arm64)可以使用 ndk 中提供的addr2line来根据地址进行一个符号反解的过程,该工具在 $NDK_HOME/toolchains/aarch64-linux-android-4.9...arm64-v8a下的so文件) aarch64-linux-android-addr2line -f -C -e /Users/xxx/Documents/AdvanAndroid/BreakpadDemo.../app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/arm64-v8a/libbreakpad-native.so 0x325f4

    1.6K20

    【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★

    寄存器的存档与恢复 ) 【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 ) 【Android...目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 ) 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so...三 | 等待远程函数执行完毕 | 寄存器获取返回值 ) 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用...这两个版本的 NDK , 其它版本 , 大概率会编译失败 ; 配置完成后 , 右键点击 解决方案 , 选择 " 仅用于项目 / 仅生成 magic " 选项 , 命令行输出如下内容 , 说明编译完成...逆向】修改运行中的 Android 进程的内存数据 ( Android 命令行中获取要调试的应用进程的 PID | 进程注入调试进程内存的 so 库 ) 【Android 逆向】修改运行中的 Android

    2.1K20

    一种Android App在Native层动态加载so库的方案

    为什么在Native层动态加载so库 随着Android App发展的不断变化,App的性能和系统API框架外的功能拓展显得越来越重要。...这三个函数均在头文件中定义,它们的作用分别是:dlopen()打开一个动态链接库,返回一个动态链接库的句柄;dlsym()根据动态链接库句柄和符号名,返回动态链接库内的符号地址,这个地址既可以是变量指针...一般使用的加载模式有两个:RTLD_NOW在返回前解析出所有未定义符号,如果解析不出来,dlopen()返回NULL;RTLD_LAZY则只解析当前需要的符号(只对函数生效,变量定义仍然是全部解析)。...这是因为Android提供给NDK开发的C++运行时有几个版本:STLport,GNU STL,libc++,这几个版本不仅在异常使用,RTTI支持,还有开源授权都有差异,而且其中包含的C++标准库,实现细节也不一样...所以如果Android App要动态加载的so库存放在SD卡,就首先需要把so库拷贝到应用自身在/data里的存储目录,或者其他有可执行文件运行权限的目录(如/data/local/)。

    7.5K60

    Android NDK开发完全剖析

    NDK全称是Native Development Kit,是Android上实现C/C++开发的工具集,我们在Android项目中编写C++代码,然后通过交叉工具将C++代码编译成so,上层使用System.loadLibrary...里面放着include和lib文件夹,分别表示Android平台下的头文件的库文件,我们编译的任何文件都可能会引用到这个文件架下面的库。这个链接是不能少的。...==/lib/arm64/libav_media.so #17 pc 00000000000eb504 /apex/com.android.runtime/lib64/bionic/libc.so (_...需要unstripped 的so,就是我们编译出来的动态库,有两个,一个是stripped的so,相当于压缩之后去掉符号表的库文件;还有一个是没有去掉符号表的,就是我们需要的unstripped so,...提供了pc地址和包含符号表的unstripped so,我们要使用ndk中的addr2line开始解栈,我直接贴一下自动化的脚本吧,大家使用的时候直接用就行了。

    1.9K10

    Android JNI Crash定位步骤

    巧妇内为无米之炊,找到未strip的, 符号表完整的so库文件 在Android Studio 3.2.1: strip之前的文件所在目录: app/build/intermediaters/transforms...如果发现so被strip,尝试在CMake添加如下配置: # 这几行代码表示debug版本的so文件保留so保留符号库,这样会导致so文件很大, # 如果要让release版本保留符号库文件,就替换成CMAKE_C_FLAGS_RELEASE...的bin文件夹, 比如 aarch64-linux-android-4.9对应的bin文件夹是 /Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android...可以用于查看so文件中的所有函数。所以如果遇到JNI方法找不到的错误,就可以使用该工具查看so库中的所有函数,然后搜索对应的JNI方法,看到底有没有被编译到动态库中。...可以获取so文件的符号表信息,可以看到编译进来的所有方法以及调用堆栈的地址.

    2.8K10
    领券