android studio so文件打包

本文介绍了在Android Studio中如何打包SO文件的详细步骤。首先声明Java中的native方法,然后通过javac编译生成class文件。接着,使用javah生成对应的C头文件,在jni目录下创建C源文件并实现函数。配置NDK后,rebuid项目生成SO库,最后将SO文件放置于jniLibs目录下完成配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。

package com.union.webserver.encrypt;

public class AES {

    public static native String getPSW(int index);
    public static native String getVersion();
    static {
        System.loadLibrary("unionaes_v1.0");
    }
}

2、打开android studio终端,使用javac编译上述文件,生成class文件。

 D:\GitDownload\LocalServer_so\app\src\main\java\com\union\webserver\encrypt>javac AES.java


3、确认自己类的包名!然后在上一级的位置使用javah生成.h头文件

一定要在上一级哦,不然不会报错:找不到xxx类

 

比如我的AES.class在

D:\GitDownload\LocalServer_so\app\src\main\java\com\union\webserver\encrypt>

我的包名是:

package com.union.webserver.encrypt

所以我的javah命令应该这么写:

D:\GitDownload\LocalServer_so\app\src\main\java>javah -jni com.union.webserver.encrypt.AES

 

然后就能看到生成了一个h文件。

 

4、新建一个jni文件夹,新建main.c,把.h里面的内容复制进去,并实现里面的函数。

 

生成的h文件

复制代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_union_webserver_encrypt_AES */

#ifndef _Included_com_union_webserver_encrypt_AES
#define _Included_com_union_webserver_encrypt_AES
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_union_webserver_encrypt_AES
 * Method:    getPSW
 * Signature: (I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_union_webserver_encrypt_AES_getPSW
  (JNIEnv *, jclass, jint);

/*
 * Class:     com_union_webserver_encrypt_AES
 * Method:    getVersion
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_union_webserver_encrypt_AES_getVersion
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

复制代码

 

拷贝修改后的main.c

复制代码
#include "com_union_webserver_encrypt_AES.h"

char* aes_key[] = {
   "a6f80f0fb1c50889",
   "e223c05acc24be1d",
   "c2ecf58135077acc",
   "9fe907118cece5bf",
   "0c3c3ed5cff7bd96",
   "5eae4f136da0c80e",
   "d741848179f9904e",
   "0c606bd30a453198",
   "3e0ccc681e60d0fb",
   "4540064fea80bb54",
   "1c9f7606a8f57cd2",
   "8d5cd862fb0f8a7a",
   "f549147c1cfb46d8",
   "64daaeb0dcabce7d",
   "2baf2156dcc2a0bc",
   "864396c5ebfa495a",
   "c981f6bbf7f4a088",
   "677686548fab55e4",
   "130cb717a74fd032",
   "68eab7ecf1b4a3d1",
   "b35011f7a87e9f7a",
   "cf524cfdefea7260",
   "d9835d24e9cb4494",
   "3a016fa6d3622f19",
   "3ce273906ebe65cd",
   "adffbc605dacf944",
   "16349e4c587aceb5",
   "3faa70986eaae7a0",
   "9c6a6d31ede44e22",
   "4bf0dadade70a385",
   "ce3514b356d9f650",
   "4962065970030262"
};


/*
 * Class:     com_union_webserver_encrypt_AES
 * Method:    getPSW
 * Signature: (I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_union_webserver_encrypt_AES_getPSW(JNIEnv *env, jclass cl, jint i) {
    int aes_index = i;
    return (*env)->NewStringUTF(env, aes_key[aes_index]);
}

/*
 * Class:     com_union_webserver_encrypt_AES
 * Method:    getVersion
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_union_webserver_encrypt_AES_getVersion(JNIEnv *env, jclass cl) {
    return (*env)->NewStringUTF(env, "1");
}


 

5、配置NDK

打开Project的local.properties文件添加NDK路径


打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
    moduleName "unionaes_v1.0"
    abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}

 

  

还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true


6、生成SO库

完成以上步骤之后,我们rebuild一下就可以生成so库了

在项目的app\build\intermediates\ndk\debug\lib路径下


 

7、配置so库

在src\main下新建文件夹jniLibs,并将生成的SO文件拷贝到该文件夹下


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值