Android Studio 打包so和jar

工具版本 :Android Studio Electric Eel | 2022.1.1 Patch 1

看了各路大神的文章,发现好多都是几年前的,可能与现在的工具有点出入,然后自己用新版本的工具摸索出来了,NDK 和 Cmake都是用的当前时间的最新版本,NDK 25.2+ Cmake 3.22.1。文章供大家参考。

前提:默认为NDK环境变量已搭好,然后新建了一个c++工程能跑。

第一步:android studio 左上角File -> new -> new Module ->Android Library

*注意红框里的最小sdk版本不要低于你的项目版本,不然以后会出现兼容性问题。

第二步:把项目的jni、cpp文件移动到新建的module中,下面附上jni和.cpp代码

package com.wq.jsdk;

public class JniNativeHelp {

    public JniNativeHelp() {
    }

    // Used to load the 'jnidemo' library on application startup.
    static {
        System.loadLibrary("jSDK");//只需要一个so库的这里可以删
        System.loadLibrary("two_jSDK");
    }

    public native String stringFromJNI();

    public native double addMethodFromJNI(double d1,double d2);//只需要一个so库的这里可以删

    public native double subMethodFromJNI(double d1,double d2);
}

*我这里做了两个so库 所以只需要一个的同学,可以把“System.loadLibrary("jSDK");”和addMethodFromJNI方法去掉

#include <jni.h>
#include <string>
#include <android/log.h>

#define TAG "-----"
#define  LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__);

double sub(jdouble d1, jdouble d2);

extern "C"               //下面这句很重要↓↓↓
JNIEXPORT jdouble JNICALL//Java_com_wq_jsdk_JniNativeHelp_subMethodFromJNI 这里要跟你的module包名一致,最好自动生成,再复制粘贴
Java_com_wq_jsdk_JniNativeHelp_subMethodFromJNI(JNIEnv *env, jobject thiz, jdouble d1, jdouble d2) {

    return sub(d1,d2);
}

double sub(double d1, double d2) {
    LOGD("执行了减法 \n")

    if (d1 > d2) {
        return d1 - d2;
    } else if (d2 > d1) {
        return d2 - d1;
    } else {
        return 0;
    }
}

项目结构如下:

第三步: 修改CMakeLists.txt配置

cmake_minimum_required(VERSION 3.22.1)

project("jSDK")

add_library( //只需要一个so库的这里可以删
        jSDK

        SHARED

        native-lib.cpp)
add_library(
        two_jSDK
       
        SHARED

        two-native-lib.cpp)

find_library( 
        log-lib

        log)

target_link_libraries( # Specifies the target library.//只需要一个so库的这里可以删
        jSDK

        ${log-lib})

target_link_libraries( # Specifies the target library.
        two_jSDK

        ${log-lib})

*我这里用的是两个.cpp文件 所以只需要一个的自行删减。

第四步:打开Module里面的build.gradle

①在android节点下的defaultConfig节点下添加代码:

externalNativeBuild {
    cmake {
         biFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
    }
}

    ndk {
         abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}

②在android节点下添加:

 externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }

③在最外层,和android节点同层级下添加代码: (这段代码是打jar包的)

task makeJar(type: Copy) {
    delete 'build/TestJar.jar' //删除之前的旧jar包
    from('build/intermediates/javac/release/classes/') //这里是你要打包成jar的代码
    into('build/') //将jar包输出到指定目录下 (我这里也不成功)
    include('classes.jar')
    rename('classes.jar', 'TestJar.jar') //自定义jar包的名字(这里我rename并不成功!)
}
makeJar.dependsOn(build)
  • 这里我rename并没有成功,最后生成的还是叫classes.jar,然后指定的生成路径也不成功,还是自己找的

第五步生成jar包和so库:Build -> ReBuild Projuct 一下项目,然后可以Build ->Make Projuct 或者也可以直接在上一步的代码左边有个绿色的小箭头也可以。跑成功后在如下路径就能找到打出的jar包和so库了:

然后新建一个项目 导入jar包和so库运行成功。

D/-----: 获取C的字符串:hello.c_str()
D/-----: 执行了第一次加法 
D/-----: 执行了第二次加法 
D/-----: 执行了第三次加法 
D/-----: 调用C的加法  :113.3
D/-----: 执行了减法
D/-----: 调用C的减法  :1.1

打印成功。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值