当前位置:   article > 正文

Android动态加载so库

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++的语法和规范编写,并且包含您需要的功能和算法。

下面是个简单的案例

  1. #include <jni.h>
  2. extern "C" JNIEXPORT jint
  3. Java_com_example_huhaonanautomotive_MyNativeClass_addNumbers(JNIEnv *env, jobject thiz, jint a, jint b){
  4. return a+b;
  5. }

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

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

  1. # 设置CMake的最低版本
  2. cmake_minimum_required(VERSION 3.18.1)
  3. project("nativecpp")
  4. # 添加C/C++源文件
  5. # 添加本地库,命名为"native-lib",并将其链接到您的C/C++源代码文件
  6. add_library(
  7. native-lib
  8. SHARED
  9. src/main/jni/native-lib.cpp
  10. )
  11. # 导入需要的Android系统库
  12. find_library(
  13. log-lib
  14. log
  15. )
  16. # 链接库到本地库
  17. target_link_libraries(
  18. native-lib
  19. ${log-lib}
  20. )

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

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

  1. android{
  2. ndk {
  3. var abiFilters ="armeabi-v7a,arm64-v8a, x86, x86_64"
  4. };
  5. externalNativeBuild {
  6. cmake {
  7. path = File("CMakeLists.txt")
  8. }
  9. }
  10. }

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

  1. package com.example.huhaonanautomotive;
  2. import android.util.Log;
  3. public class MyNativeClass {
  4. static {
  5. //这会加载名为native-lib的本地库。
  6. System.loadLibrary("native-lib");
  7. }
  8. // 调用本地库函数: 在您的Java代码中,您可以通过声明native方法来调用本地库中的函数。例如:
  9. public native int addNumbers(int a, int b);
  10. }

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

  1. package com.example.huhaonanautomotive
  2. import android.os.Bundle
  3. import android.widget.TextView
  4. import androidx.appcompat.app.AppCompatActivity
  5. class MainActivity : AppCompatActivity() {
  6. override fun onCreate(savedInstanceState: Bundle?) {
  7. super.onCreate(savedInstanceState)
  8. setContentView(R.layout.activity_main)
  9. val myNativeClass = MyNativeClass()
  10. val numbers = myNativeClass.addNumbers(5, 7);
  11. val textView: TextView = findViewById(R.id.textView)
  12. textView.text = numbers.toString()
  13. }
  14. }

生成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中加载本地动态库的详细步骤。确保在开发过程中遵循适当的安全性和性能最佳实践,以确保您的应用程序在加载和使用本地库时表现良好。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/922741
推荐阅读
相关标签
  

闽ICP备14008679号