精华内容
下载资源
问答
  • 这是你去加载一个so库的时候出现的问题,感觉什么都对,就是报错 网上下了一个Android源码,导入android Studio中之后无法调试,其中有问题的代码是这样的:1.Cannot resolve corresponding JNI function Java_...

    一、 cannot resolve corresponding JNI function
    这是你去加载一个so库的时候出现的问题,感觉什么都对,就是报错
    网上下了一个Android源码,导入android Studio中之后无法调试,其中有问题的代码是这样的:

    1.Cannot resolve corresponding JNI function Java_com_keepassdroid_crypto native_AesCipherSPI_Update
    2.Reports native method declaration in Java where no corresponding JNI function is found in the project.

    解决办法:

    1.File—>Settings—>Plugins,将Android NDK Support(如下图中第一项)后面的对勾去掉。

    这里写图片描述

    2.重新启动Android Studio并加载project。

    参考:Cannot resolve corresponding JNI function
    cannot resolve corresponding JNI function

    展开全文
  • 安卓so库动态载入

    千次阅读 2019-08-17 18:00:41
    从asset目录加载so库,安装时不导出so库,不会导致安装失败,运行时生成并载入) com.google.android.finsky.cu.k.onReceive(20): Error -504 while installing sc.game.farm: INSTALL_FAILED_INVALID_APK:...

    so库动态载入,修复应用无法安装。


    (so库动态加载示例。从asset目录加载so库,安装时不导出so库,不会导致安装失败,运行时生成并载入)

     

     

    com.google.android.finsky.cu.k.onReceive(20): Error -504 while installing sc.game.farm: INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2

    INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2

     

    修复方法:


    1、将AssetsSo.jar添加至项目的lib目录下:

    2、剪切原libs目录下,so对应的目录,至assets/so/目录下

    3、设置Application为sc.tool.so.AssetsSoApp

    4、编译运行项目即可

     

    AssetsSo.zip(下载)


    附录:

    AssetsSo实现原理,详细说明:


    /**
     * AssetsSoApp用于so文件运行时动态加载,加载目录为assets/so/
     * 
     * 用法:
     * 
     * 1、将原来libs/目录下的  armeabi、x86、 armeabi-v7a...,直接剪切至assets/so/目录下即可。
     * 2、将AndroidManifest.xml中的application设置为:  <application android:name="sc.tool.so.AssetsSoApp">;
     * 或者 调用 AssetsSoApp.LoadAssetsSo(this);
     * 
     * 注解: lib/目录下的so文件,在应用安装时就会输出,时常会报错导致应用无法正常安装。
     * {
     * 如:
     * 1、Google Play Store – Can’t install app (Error code: -504)
     * 2、is not page-aligned - will not be able to open it directly from apk
     * 3、Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2] 

    Failure copying native libraries [errorCode=-2]

    Commit of session 1430937614 failed: Failed to extract native libraries, res=-2


     * (此报错修改 aplication属性可以为 android:extractNativeLibs="true"编译的apk可正常运行,可从google play下载却无法安装,还是报第2个错误,
     * 干脆修改为so动态加载,就不会报错了,也可正常安装、运行)
     * }
     * 
     * 修复原理: so不添加至lib目录,不在应用安装时输出,正常安装。应用运行时,输出对应类型的so库,从该目录下动态加载
     * 
     * @author scimence@163.com
     */

    应用安装目录:(若so存放在lib目录下,则在安装apk时,会自动输出)

     

    自定义动态载入目录:(so不存放存到lib目录下,在运行时,输出至该目录,从此处载入)

     

     

    展开全文
  • 安卓动态加载SO文件点击上方“技术支持联盟”,选择“置顶公众号”第一时间了解程序员大小事儿作者:百香果,一个坚持认为Coding能改变世界的程序猿,喜欢分享,望互相学习指正,博客地址:www.devmajun.com。...

    安卓动态加载SO文件

    点击上方“技术支持联盟”,选择“置顶公众号”

    第一时间了解程序员大小事儿

    作者:百香果,一个坚持认为Coding能改变世界的程序猿,喜欢分享,望互相学习指正,博客地址:www.devmajun.com。

    摘要:成熟的 Android 项目中几乎所有的项目都会用到c/c++代码编译成的so动态库,APK 体积的主要占比是资源文件或动态库,但是有些动态库实现的功能不会经常使用,所以 so 动态化的价值越来越凸显。

    15950917-1218-eb11-8da9-e4434bdf6706.jpeg

    01

    好处

        在开发中,我们时常会遇到包体积过大的情况。其中,一个大的第三方so文件会增加apk安装包的大小集成一个具有多中cpu架构的so文件能够甚至能够使apk增加10M以上,这是非常让人头痛。那么,能否动态加载.so文件呢?答案是可以的。02

    原理

        我们知道,如果我们在工程中引入一个so文件,当我们用gradle编译打包时,gradle会将我们jniLibs中的so文件,打到APK包中的lib文件夹下。    

        然后我们安装APK时,系统会将APK包lib文件夹中的so文件拷贝到APP的私有目录下。具体来说就是:/data/user/0/[包名]/app_libs/

        所以,我们可以将想要加载的so文件,在程序运行时,拷贝到APP的私有目录的对应位置中,然后使用System.load(...);

    03

    需要注意的问题

    动态加载 so 库文件,并不是说可以把文件随便存放到某个 sdcard 文件目录下,这样做既不安全,系统也加载不了。

        我们在 Android 中加载 so 文件,提供的 API 如下:

        第一种,pathName 库文件的绝对路径

        void System.load(String pathName);

        第二种,参数为库文件名,不包含库文件的扩展名,必须是在JVM属性Java.library.path所指向的路径中,路径可以通过

    System.getProperty('java.library.path') 获得void loadLibrary(String libname)

        注意:而这里加载的文件路径只能加载两个目录下的 so 文件。那就是:

    1、/system/lib

    2、应用程序安装包的路径,即:/data/data/packagename/…

        所以,so 文件动态加载的文件目录不能随便放。这是需要注意的一点。

    04

    实现思路

    既然使用动态加载的好处和陷阱我们都大致了解了,那就可以在实现的时候,注意陷阱就可以了。那基本思路如下:

    1、网络下载 so 文件到指定目录

    2、从指定下载的目录复制 copy so文件到可动态加载的文件目录下,比如:/data/data/packagename/…

    3、配置 gradle ,指定 cpu 架构

    4、load 加载

    注:我们这里可以简单忽略,假设我们把 so 文件下载到了 /mnt/sdcard/armeabi 目录下。

    05

    实现过程

    配置 gradle 指定 cpu 架构

    我们都知道,在使用 so 文件的时候,so 库类型和 CPU 架构类型,要一致,否则是会报错的。原因很简单,不同 CPU 架构的设备需要用不同类型 so 库。CPU架构有如下几种类型:ARMv5,ARMv7,x86,MIPS,ARMv8,MIPS64 ;和 ;x86_64。如果要适配很多手机,就需要在不同的类型下,放置对应的 so 文件。

    配置方法如下:

    17950917-1218-eb11-8da9-e4434bdf6706.png

    复制目录到包路径下

    复制目录到包路径下

    那我们就应该把 /mnt/sdcard/armeabi 目录下的 so 文件,复制到 应用的包路径下。

    19950917-1218-eb11-8da9-e4434bdf6706.png

    其实并不是我们把相应的文件复制到相应的目录下之后直接调用System.load(...);  就可以的话,这样想法就太天真了(想想我们自己在开发so文件的时候,是怎么一个执行流程)

    查看安卓加载so文件的源码

    复制目录到包路径下

    1b950917-1218-eb11-8da9-e4434bdf6706.png

        注:首先会调用system.maplibraryname函数获得so的名字,比如我传入的参数是test(这个test就是在调用system.loadlibrary(“test”)时传入的),则这个函数的作用就是将其转换为类似libtest.so这样的名字,然后遍历nativelibrarydirectories数组,这是一个file文件夹数组,看其文件夹下是否存在对应的so,并且是否可读,如果满足条件,则直接返回。那么我们就可以将我们的patch的so所在目录插入到这个数组最前面即可完成so的动态加载

    实践后得出的结论是这种方式是完全可行的,只不过android 6.0中这部分代码逻辑发生了改变。

    1d950917-1218-eb11-8da9-e4434bdf6706.png

        在android 4.0-5.1中,只需要将文件夹目录插入到nativelibrarydirectories数组最前面即可,这个过程直接使用反射插入patch的so所在目录到数组最前面。

     所以在6.0中需要将so的patch目录转换为element对象,插入到nativelibrarypathelements最前面,element的对象可以直接用反射去实现下面的代码进行构造即可。下面贴出反射的代码。

    1e950917-1218-eb11-8da9-e4434bdf6706.png

    06

    总结

    1、下载so文件到本地的sdcard目录中

    2、在/data/user/0/packge_name/app_libs目录中创建cpu架构的目录

    比如 /data/user/0/packge_name/app_libs/armeabi

    /data/user/0/packge_name/app_libs/armeabi-v7a

    /data/user/0/packge_name/app_libs/arme64-v8a

    /data/user/0/packge_name/app_libs/x86

    /data/user/0/packge_name/app_libs/x86-64

    (3) 把相应的so文件拷贝到以上文件目录中

    (4) 使用反射把这些目录构造成elemen对象插入到 nativeLibraryPathElements数组前边 ,到此就完成了动态加载。

    1f950917-1218-eb11-8da9-e4434bdf6706.pngEND

    21950917-1218-eb11-8da9-e4434bdf6706.gif

    展开全文
  • 安卓so库使用

    2021-05-13 16:21:59
    2、申明加载so库文件 package com.example.sotest; public class myjni { static { System.loadLibrary("JniTest"); } public native static String sayhello(); } 3、buid.gradle中加上红色部分 ...

    安卓so库使用备忘记录:

    1、新建libs目录,armeabi-v7a,可兼容64位v8架构

    2、申明加载so库文件

    package com.example.sotest;
    
    public class myjni {
        static {
            System.loadLibrary("JniTest");
        }
    
        public native static String sayhello();
    
    
    }
    

    3、buid.gradle中加上红色部分

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 30
        buildToolsVersion "30.0.2"
    
        defaultConfig {
            applicationId "com.example.sotest"
            minSdkVersion 19
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            externalNativeBuild {
                cmake {
                    cppFlags "-std=c++17"
                }
            }
            ndk{
                abiFilters 'armeabi-v7a'
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        externalNativeBuild {
            cmake {
                path "src/main/cpp/CMakeLists.txt"
                version "3.10.2"
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: "libs", include: ["*.jar"])
        implementation 'androidx.appcompat:appcompat:1.2.0'
        implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.2'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    
    }

     

    展开全文
  • 安卓开发之so库加载使用的那些坑

    万次阅读 2015-12-27 22:55:34
    ),所以就算你不用NDK开发也一定会跟SO打交道,你确定你加载SO的姿势都对了吗? 二、错误场景分析 1、低级错误——根本木有SO,你加载个球啊! code System.loadLibrary(Bugly); libs 空 运行设备 ...
  • 安卓HAL层 so库文件加载原理

    千次阅读 2016-07-04 15:18:22
    本文分析代码基于安卓6.0 上层app通过jni调用hal层的hw_get_module函数获取硬件模块,这个函数是上层与hal打交道的入口 这里我们就具体来看看hw_get_module的实现 文件路径: vim hardware/libhardware/...
  • 安卓App在启动或运行时经常会遇到.so动态库加载失败的情况,其中具体...2.在程序运行过程中,已经加载好的.so库被卸载,导致使用的时候找不到符号,这种情况下就要在运行过程中,需要用到库的时候重新去加载 第2种情...
  • 真是哔了狗了。 ...N天之后的今天,突然打包安装的应用报错说.so库加载不出来了。 然后进入暴走模式,纠结了一天。 最后发现,应该放在/jniLibs/armeabi-v7a目录下。 转载于:https://www.cnb...
  • 近期在做人脸识别的功能,集成了虹软的...虹软给提供的支持sdk的so库只有两个:armabi和armabi-v7a。 虹软人脸识别Demo顺利编译通过,在两台设备上也正常运行,嗯,一切都很正常,后来我发现仅仅一个Demo的包就有...
  • 这是对应java层,当然java层还是需要有个固定的包名的,这是不能避免的,但是你可以直接使用这个类去load你需要的so库类 static { System.loadLibrary("Loadso"); /** * 动态注册jni函数 * 不需要写...
  • 前言首先要知道,64位...但是我们项目没有这么做,而是在app中同时放了32和64位so,导致apk的体积暴增,原因是app中有3D图形加载比较耗cpu,因此在64位设备上运行为了实际体验使用64位的so,而其他功能如mp3转码,p...
  • 下面我们就来实现一个把私密信息保存成so库,然后让App动态加载,或许这些私密信息。 1)首先,安装安卓的NDK开发环境: 比较完整的NDK开发步骤: 我也按照网上的配置了很多次生成so文件的时候总是会出现问题,编译...
  • 怎样在64位安卓系统中使用32位SO库

    千次阅读 2017-05-29 09:44:08
    关键点:JAVA编译不分32bit和64bit(APK,JAR)可执行文件,默认编译64位动态和静态,默认同时编译32bit和64bit版本通过LOCAL_MULTILIB可以指定特定模块编译32bit或64bit或都编译JAVA加载JNI
  • 怎样在64位安卓系统中使用32位SO库 2

    千次阅读 2017-05-30 00:23:21
    我仍然很清楚的记得, 当年 CEO 在给大家讲解财报,描述技术蓝图的时候, 宣称 64bit 软件的运行效率其实远不如预期, 因为所有的代码要备两份存储, 代码可能要两次加载过程, cache 利用率不高,软件修改量却很大...
  • Cocos2dx加载第三方库so

    2017-03-07 19:37:15
    Cocos2dx在安卓上移植的时候,加入第三方库,却发现新加的so库被删掉了。 正文: 1、我的环境: cocos2d-x 2.2.3, ndk-r9 2、网上找了很多,但是好多说法都没能成功,ndk编不过,最后找了个方法。这里...
  • 安卓】 -002 JNI在低版本安卓上运行报“cannot locate symbol “__register_atfork” referenced by "libxxx.so"错误   最近在弄C++代码转安卓库的时候,发现原来用NDK编译好的在实际设备上运行时,加载过程...
  • Android 逆向破解之so加载时机

    千次阅读 2017-02-16 16:53:21
    安卓安全领域,封装核心算法入so库是一个很好的机制,比如应用框架层的HAL,以及APP开发中的NDK。 道高一尺魔高一丈,攻防话题亘古持续。今天从共享库so文件破解的JNI_Onload下断技巧入手,讲解一下so的Android加载...
  • 最近本人研究ffmpeg编译,在使用ndk交叉编译x86平台的.so库文件后,加载使用时,出现错误 java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/xxx.xxx.xxx-1/lib/x86/libavcodec.so: has text relocations...
  • .so作为安卓系统中最常见的二进制文件,如何高效地加载和调用so是每个开发者必备的技能。了解安卓系统中.so文件特性,对于开发者来说非常必要的。360加固保高级安全研究员吴乐,通过本文为开发者详细讲解了安卓系统...
  • 安卓JNI提高

    2015-01-23 11:38:13
    JAVA层的调用 so库的加载 在使用调用JNI的类中,总是可以看到如下的代码片段。 static { Log.d(TAG,"Loading JNI Library");...//加载so库 } 称之为静态代码块,在类加载的时候,静态代码
  • Native方法 安卓的底层是Linux实现,但...因此安卓允许通过so库加载来调用底层linux执行代码,这就是Native方法 具体使用方法为在java层中使用System.loadlibrary(“test”),虚拟机会去载入libtest.so文件,...
  • Android Studio中当用到jni层编码时,结合ndk-build,编译.so库是需要.mk文件,常用的语句网上都比较多,本文解决静态库加载编译的问题。 首先注明一点,代码编译依赖库一般分为静态库(如.a、.lib)和动态库(如.so...
  • 1-安卓底层-基础

    2017-02-16 20:27:11
    1-安卓底层–基础先看看代码: java 调用 C/C++ 代码1.TestJni.javapublic class TestJni{ ... //加载 libxxx.so 文件 } public native void hello(); //本地方法,在so文件里实现 public static void

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

安卓加载so库