Android studio中如何生成jar包?

文章目录

需求背景

别部门做C语言开发的同学开发了一个库,需要给我们Android端去调用。

我们拿到源码,首先需要做的是通过CMake去把C源码编译链接成动态库。

当然静态库也行,看项目需求吧。不过大部分都是编译动态库,不理解动态库和静态库概念的同学可以翻看我的Linux专栏,里面有详细的介绍。

然后就是通过编写JNI代码去调用这个.so库。

我们作为Android开发工程师,要把输出的.so目标文件和调用这个.so文件的Java代码封装给别的不懂JNI的Android开发同学。

基于上述场景和需求。

我们输出的产物需要有:一个.so库(跟进不同cpu架构一共有4种不同的目标文件)+ 一个.jar文件。

本文介绍的是如何生成对应的.jar文件。关于JNI和CMake的知识可以查看我专栏的其他博文。

目录结构

首先,这个模块是个library,结构如下:

由于JNI代码,Java的native方法映射到JNI中C++代码的方法是通过包名+方法名映射的,包名不一样会导致无法调用.so库的代码。

Java层的native方法:

JNI层的C++方法:

所以我们需要做的是把Java层用于调用JNI层的代码打包起来,作为jar包提供给外部。

gradle结构

java 复制代码
plugins {
    id 'com.android.library'
}

android {
    namespace 'com.xxx.nativelib'
    compileSdk 33

    defaultConfig {
        minSdk 24
        targetSdk 33

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.22.1"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }
}

//定义一个makeJar任务
task makeJar(type: Copy) {
    //删除存在的
    delete 'build/libs/KsnetSecurity.jar'

    //from这个语法是将aar_main_jar目录下的release目录下的classes.jar文件拷贝到build/libs/目录下
    //设置拷贝的文件,build/intermediates/aar_main_jar/release/目录下的classes.jar
    from('build/intermediates/aar_main_jar/release/')

    //into表示 classes.jar打进jar包后的文件目录
    // build/libs/表示classes.jar打进jar包后的文件目录
    //将classes.jar放入build/libs/目录下
    into('build/libs/')

    //include表示的是我们只关心classes.jar这个文件
    include('classes.jar')
    //重命名
    rename ('classes.jar', 'xxxxx.jar')
}

//作用是在执行makeJar任务之前,先执行build任务
makeJar.dependsOn(build)

dependencies {
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

makeJar的语法解析

java 复制代码
//定义一个makeJar任务
task makeJar(type: Copy) {
    //删除存在的
    delete 'build/libs/KsnetSecurity.jar'

    //from这个语法是将aar_main_jar目录下的release目录下的classes.jar文件拷贝到build/libs/目录下
    //设置拷贝的文件,build/intermediates/aar_main_jar/release/目录下的classes.jar
    from('build/intermediates/aar_main_jar/release/')

    //into表示 classes.jar打进jar包后的文件目录
    // build/libs/表示classes.jar打进jar包后的文件目录
    //将classes.jar放入build/libs/目录下
    into('build/libs/')

    //include表示的是我们只关心classes.jar这个文件
    include('classes.jar')
    //重命名
    rename ('classes.jar', 'xxxxx.jar')
}

//作用是在执行makeJar任务之前,先执行build任务
makeJar.dependsOn(build)

这里的makeJar代码用于定义一个名为makeJar的任务。

  1. 任务依赖关系:

    groovy 复制代码
    makeJar.dependsOn(build)

    此语句表示在执行makeJar任务之前,需要先执行build任务。dependsOn是Gradle中用于定义任务之间依赖关系的方法,确保在执行makeJar之前,build任务已经成功执行。

  2. 定义makeJar任务:

    groovy 复制代码
    task makeJar(type: Copy) {

    这部分定义了一个名为makeJar的任务,它的类型是Copy,这意味着它是一个拷贝任务,用于复制文件。

  3. 删除已存在的文件:

    groovy 复制代码
    delete 'build/libs/KsnetSecurity.jar'

    此语句表示在执行makeJar任务之前,删除已存在的build/libs/xxxxx.jar文件。

  4. 设置拷贝源和目标:

    groovy 复制代码
    from('build/intermediates/aar_main_jar/release/')
    into('build/libs/')

    这两行语句设置了拷贝的源目录和目标目录。from表示从指定目录拷贝文件,into表示将文件拷贝到指定目录。

  5. 指定拷贝文件及重命名:

    groovy 复制代码
    include('classes.jar')
    rename ('classes.jar', 'xxxxx.jar')

    include指定了需要拷贝的文件(此处是classes.jar),而rename则指定了拷贝到目标目录后的重命名规则,将classes.jar重命名为xxxxx.jar。

    这个脚本的主要目的是在执行makeJar任务之前,先执行build任务,并在执行makeJar任务时,进行文件拷贝和重命名,生成最终的JAR文件。

执行makeJar 任务

点击左上方的三角形按钮,既可以开始构建和运行任务。

拿到jar包

在build文件夹下的libs目录可以找到生成的jar包:

相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone5 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui