介绍
在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/obj
或app/build/intermediates/ndk/debug/lib
,具体取决于您的构建配置。
运行应用程序: 您现在可以运行您的Android应用程序。Android Studio会自动将SO库与应用程序一起打包,并在运行时加载它们。当您调用System.loadLibrary
时,它将加载您的本地库,从而使您能够调用其中定义的函数。
这些是在Android Studio中加载本地动态库的详细步骤。确保在开发过程中遵循适当的安全性和性能最佳实践,以确保您的应用程序在加载和使用本地库时表现良好。