Android动态加载so库

介绍

在Android应用程序中,动态加载SO库指的是在应用程序运行时加载共享对象(SO)库文件,以便使用其中定义的函数和数据。这种技术允许您在不重新启动应用程序的情况下,根据需要加载和卸载SO库,从而实现更灵活的应用程序设计和模块化。

So库的介绍

SO库,也称为共享对象库(Shared Object Library)或动态链接库(Dynamic Link Library),是一种在计算机程序中共享代码和数据的文件。SO库包含了一组函数和数据,这些函数和数据可以被多个程序共享和重复使用。

动态加载的优点

  • SO库通常用于操作系统和应用程序之间共享代码,以减少内存占用和提高效率。
  • SO库的一个主要特点是它们在运行时被动态加载到内存中,而不是在编译时静态链接到程序中。这意味着多个程序可以同时使用同一个SO库,从而节省内存空间,并且如果SO库的更新版本可用,只需更新库文件而不需要重新编译所有使用它的程序。

以下是在Android Studio中加载本地动态库的详细步骤:

创建C/C++源代码文件夹: 在您的Android项目中,创建一个用于存放C/C++源代码的文件夹。通常,您可以在项目的src/main目录下创建cpp或jni这个文件夹。

编写C/C++代码: 在C/C++源代码文件夹中编写您的C/C++代码。这些代码将包含在SO库中。确保您的代码按照C/C++的语法和规范编写,并且包含您需要的功能和算法。

下面是个简单的案例

#include <jni.h>

extern "C" JNIEXPORT jint
Java_com_example_huhaonanautomotive_MyNativeClass_addNumbers(JNIEnv *env, jobject thiz, jint a, jint b){
            return a+b;
    }

配置CMake或NDK Build System: 您可以选择使用CMake或NDK Build System来构建和编译您的C/C++代码。在Android Studio中,CMake是更常用的选项。在项目的根目录下,创建一个CMakeLists.txt文件,您可以在其中配置CMake构建。

使用CMake: 打开您的CMakeLists.txt文件,添加必要的配置,以指示CMake如何构建您的本地库。以下是一个示例CMakeLists.txt文件的部分内容:

# 设置CMake的最低版本
cmake_minimum_required(VERSION 3.18.1)
project("nativecpp")
# 添加C/C++源文件



# 添加本地库,命名为"native-lib",并将其链接到您的C/C++源代码文件
add_library(
        native-lib
        SHARED
        src/main/jni/native-lib.cpp
)

# 导入需要的Android系统库
find_library(
        log-lib
        log
)

# 链接库到本地库
target_link_libraries(
        native-lib
        ${log-lib}
)

配置 grade 指定 cpu 架构和Cmake路径

我们都知道,在使用 so 文件的时候,so 库类型和 CPU 架构类型,要一致,否则是会报错的。原因很简单,不同 CPU 架构的设备需要用不同类型 so 库。CPU架构有如下几种类型:ARMv5,ARMv7,x86,MIPS,ARMv8,MIPS64 和 x86_64。如果要适配很多手机,就需要在不同的类型下,放置对应的 so 文件。
在在模块中的build.gradle中配置gradle文件,配置方法如下:

android{
  
   ndk {
            var abiFilters ="armeabi-v7a,arm64-v8a, x86, x86_64"
        };


  externalNativeBuild {
        cmake {
            path = File("CMakeLists.txt")
        }
    }

}

编写Java代码: 在Android Studio中,创建一个Java类,该类将与本地库进行交互。您可以使用System.loadLibrary方法来加载本地库。例如:

package com.example.huhaonanautomotive;

import android.util.Log;

public class MyNativeClass {

    static {
        
        //这会加载名为native-lib的本地库。
        System.loadLibrary("native-lib");
    
    }
//    调用本地库函数: 在您的Java代码中,您可以通过声明native方法来调用本地库中的函数。例如:
    public native int addNumbers(int a, int b);
}

调用本地库函数: 在MainActivity中调用调用本地库中的函数,并显示到UI中

package com.example.huhaonanautomotive

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        val myNativeClass = MyNativeClass()
        val numbers = myNativeClass.addNumbers(5, 7);
        val textView: TextView = findViewById(R.id.textView)
        textView.text = numbers.toString()

    }



}

生成SO库: 在Android Studio中,您可以使用CMake或NDK Build System来构建项目。在构建过程中,SO库将被生成并放置在合适的目录中,通常是app/build/intermediates/cmake/debug/objapp/build/intermediates/ndk/debug/lib,具体取决于您的构建配置。

运行应用程序: 您现在可以运行您的Android应用程序。Android Studio会自动将SO库与应用程序一起打包,并在运行时加载它们。当您调用System.loadLibrary时,它将加载您的本地库,从而使您能够调用其中定义的函数。

这些是在Android Studio中加载本地动态库的详细步骤。确保在开发过程中遵循适当的安全性和性能最佳实践,以确保您的应用程序在加载和使用本地库时表现良好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值