文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android将so库封装到jar包中并加载其中的so库

2022-06-06 14:08

关注

Android将so库封装到jar包中并加载其中的so库

之前写过将jar包和so库封装到jar包中的文章,但是没有考虑别人调用时需要加载so库的问题。因为so库放入jar之后,so就不是一个独立的.so文件了,用System.load()加载就会提示找不到这个库,所以要想加载这个so 就需要把so 从jar 中提取出来,保存为临时文件,然后再加载。但是不能直接提取.so文件,需要把.so文件改成.jet文件封装到jar中,再进行提取拷贝。

如何建立一个项目以及项目的结构还有模块我就不说,可以看我之前的文章:Android 将module中的jar、so包打包成jar或者aar文件
我这里只是对so库封装到jar包做一些修改,这样方便后续项目加载so库。

1.将so后缀改成.jet,然后放到下图目录中,如果有多个cpu架构可以放多个。
在这里插入图片描述
2.修改build.gradle文件task makeJar(type: Jar)方法

apply plugin: 'com.android.library'
android {
    compileSdkVersion 29
    defaultConfig {
        minSdkVersion 22
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    sourceSets {
        main {
//            jni.srcDirs = []
//                jniLibs.srcDirs = ['src/main/jniLibs']//设置目标的so存放路径
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
        lintOptions {
            abortOnError false
        }
    }
    task makeJar(type: Jar){
        //删除存在的
        delete 'build/libs/newsdk.jar'  //删除存在的
        archivesBaseName = 'newsdk'  //输出的jar包名称
        from(project.zipTree('build/intermediates/packaged-classes/release/classes.jar'))
        from(project.zipTree('build/intermediates/packaged-classes/release/libs/AMap_Search_V7.1.0_20191030.jar')) //需要打包的第三方jar包
//        from fileTree(dir: "src/main/java", include: "***.jet") //把src/main/java目录下包含的所有.jet文件封装到jar包
        destinationDir = file('build/libs')  //打成jar包后存放的文件目录
    }
    makeJar.dependsOn(build)
}
dependencies {
    testImplementation 'junit:junit:4.12'
    implementation files('libs/AMap_Search_V7.1.0_20191030.jar')
}

3.点击makejar编译出jar包,将其引入到项目中,打开可以看到里面包含了a.jet和b.jet文件,如下图。
在这里插入图片描述
4.在项目中通过Java代码加载jar中的so库,这里只展示加载a.so库。原理:获取a.jet的文件流,再把文件流输入到临时文件a.so中, System.load()方法加载a.so文件(简单点说,就是把a.jet文件拷贝出来),这样就可以了。

static {
    try {
        InputStream is = null;
        is =  SysLoad.class.getResourceAsStream("/com/example/libraryb/arm64-v8a/a.jet");
        File tempFile = File.createTempFile("a", ".so");
        FileOutputStream fos = new FileOutputStream(tempFile);
        int i;
        byte[] buf = new byte[1024];
        while ((i = is.read(buf)) != -1) {
            fos.write(buf, 0, i);
        }
        is.close();
        fos.close();
        System.load(tempFile.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

注意:提取a.jet文件时,要注意改一下路径,改成你自己的。


作者:feng海涛


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯