Android Studio项目加载预编好的so库

Android Studio项目加载预编好的so库

文章目录

  • [Android Studio项目加载预编好的so库](#Android Studio项目加载预编好的so库)
    • 一、前言
    • 二、加载so实现
      • [1. 添加`.so`文件到项目中](#1. 添加.so文件到项目中)
      • [2. 配置`build.gradle`](#2. 配置build.gradle)
      • [3. 使用JNI调用`.so`文件中的函数](#3. 使用JNI调用.so文件中的函数)
    • [三、Android Studio项目加载预编好的so库小结](#三、Android Studio项目加载预编好的so库小结)

一、前言

Android 项目中需要调用别人的so的实现,那么我们的应用需要如何操作呢?

本文主要介绍Android Studio中如何调用现有的so库代码。

Android JNI生成的so库有很多不同架构类型,比如:armeabi、armeabi-v7a、arm64-v8a、x86;

Android JNI SO库和对应的CPU架构介绍:

https://blog.csdn.net/wenzhi20102321/article/details/137064391

二、加载so实现

在Android Studio中加载或使用.so(共享对象)文件,通常涉及到使用Android的原生开发套件(NDK)和JNI(Java Native Interface)。

以下是基本步骤:

1. 添加.so文件到项目中

复制代码
(1)在你的Android Studio项目中,打开`app`模块下的`src/main`文件夹。
(2)创建一个名为`jniLibs`的新文件夹(如果还没有的话)。
(3)在`jniLibs`文件夹内,根据你的`.so`文件的架构创建对应的子文件夹,
如`armeabi-v7a`、`arm64-v8a`、`x86`、`x86-64`。
(4)将你的`.so`文件复制到对应架构的文件夹中。

上面的 jniLibs 的名称可以是任意的,只要下面 jniLibs.srcDirs 属性写对应即可。

2. 配置build.gradle

确保在app模块的build.gradle文件中,有以下配置来告知Android Studio包含.so文件:

groovy 复制代码
android {
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
}

3. 使用JNI调用.so文件中的函数

为了从Java或Kotlin代码中调用.so文件里的原生函数,你需要知道 JNI 的native方法和返回值情况。

在JNI C/C++代码中:
cpp 复制代码
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapp_MainActivity_nativeFunction(JNIEnv *env, jobject thiz) {
    // 实现逻辑
}

如果不关心具体逻辑实现,是可以不看jni cpp的方法也可以的,也不需要任何cpp代码;

上面这个cpp代码只是为了知道so相关nativie方法需要定义在哪个包名和类型里面;

并且下面定义和调用nativie方法的Java类,一定是要保证包名和类型一直的,否则会报错。

在Java/Kotlin代码中:
java 复制代码
public class MainActivity extends AppCompatActivity {
    // 加载.so库
    static {
        System.loadLibrary("mylibrary"); // 这里的`mylibrary`是你的`.so`文件的名称,不包含前缀`lib`和后缀`.so`
    }

    // 声明本地方法
    public native void nativeFunction();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 调用本地方法
        nativeFunction();
    }
}

确保你的.so文件名称与System.loadLibrary调用中指定的名称匹配(不包括lib前缀和.so后缀)。

例如,如果你的文件名是libmylibrary.so,则应该传递"mylibrary"System.loadLibrary

这里只是实例演示,实际的native方法定义最好是写在一个JNIXXX工具类,其他应用调用就可以在任意的Activity类或者其他类中调用。

这些步骤提供了在Android Studio项目中使用.so文件的基本方法。

三、Android Studio项目加载预编好的so库小结

操作:导入so到app项目中,在build.gradle定义jni 的so目录。

注意事项:

调用示例中loadLibrary 加载so和定义native方法的Java代码必须和之前编写so的Java代码的包名和类名一致。

可以不用知道so相关的cpp方法,但是必须要知道so中关联native方法的Java类的包名和类型+API方法.

相关推荐
敲代码的瓦龙1 小时前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio
Godikov1 小时前
Android 工控终端实战:从秒级卡顿到毫秒响应,SQLite/LitePal 性能优化全记录
android
辰辉创聚3 小时前
禽流感病毒分子基础:表面抗原与内部转录复合体的功能解析
ide·leetcode·rabbitmq·重组血凝素蛋白·甲型流感病毒核蛋白·禽流感单抗
星间都市山脉3 小时前
Android16 SystemService.onBootPhase 调用时机
android·java·linux·windows·ubuntu
swithun3 小时前
不用 WebView,我用 Kotlin + Compose Multiplatform 重写 Mermaid,并做了 2048 组对拍
android·开源·kotlin
AI吃大瓜4 小时前
人脸检测和行人检测4:Android实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)
android·yolo·人脸检测·人体检测·行人检测·yolo26
与海boy4 小时前
Prompt模版
android·prompt
FlightYe4 小时前
音视频修炼之编码器(一):AVC、HEVC编码器内部
android·linux·c++·音视频
智购科技无人售货机工厂4 小时前
2026自动售货机AI智能体架构:从47个小模型到33.7亿Token的工程实践~YH
android·人工智能·驱动开发·单片机·pandas
嵩风抚5 小时前
一款HK银行APP的业务+技术
android·flutter·react native·html5