Android使用so库 h文件

在Android开发中,有时候我们会遇到需要使用C/C++代码来实现一些功能的情况。这时,我们可以通过使用so库和h文件来实现与Java代码的交互。本文将介绍如何在Android项目中使用so库和h文件。

什么是so库和h文件
  • so库:so库是一种动态链接库,通常包含了用C/C编写的代码。在Android开发中,我们可以将一些性能要求较高的代码或者底层功能用C/C实现,并编译成so库,然后在Java代码中调用这些so库来实现相应功能。
  • h文件:h文件是头文件,通常包含了函数的声明和定义。在使用so库的时候,我们需要将so库的函数声明和定义放在h文件中,以便Java代码调用。
如何使用so库和h文件
  1. 创建一个Android项目

首先,我们需要创建一个Android项目。在项目的src/main目录下创建一个jni文件夹,用于存放C/C++代码和so库。

  1. 编写C/C++代码

jni文件夹下编写C/C++代码,实现相应的功能。例如,我们编写一个简单的C函数,用于计算两个数的和。

#include "add.h"

int add(int a, int b) {
    return a + b;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  1. 创建h文件

jni文件夹下创建一个add.h文件,用于存放函数声明。

#ifndef ADD_H
#define ADD_H

int add(int a, int b);

#endif
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. 编译生成so库

在项目根目录下创建一个CMakeLists.txt文件,用于配置CMake编译选项。

cmake_minimum_required(VERSION 3.4.1)

add_library( add-lib
             SHARED
             src/main/jni/add.c )

target_link_libraries( add-lib
                       log )
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

然后,在jni文件夹下创建一个CMakeLists.txt文件,用于指定生成so库的名称和头文件位置。

cmake_minimum_required(VERSION 3.4.1)

include_directories(${CMAKE_SOURCE_DIR}/src/main/jni)

add_library( add-lib
             SHARED
             add.c )

target_link_libraries( add-lib
                       log )
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

运行CMake,生成so库。生成的so库会存放在src/main/jniLibs目录下。

  1. 在Java代码中调用so库

在Java代码中加载so库,并调用对应的函数。

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("add-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int result = add(1, 2);
        Log.d("MainActivity", "result: " + result);
    }

    public native int add(int a, int b);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
关系图
erDiagram
    SO库 <|-- H文件
    SO库: 包含C/C++代码
    H文件: 包含函数声明和定义

通过以上步骤,我们就可以在Android项目中使用so库和h文件了。使用so库可以加快一些性能要求较高的功能的运行速度,提高APP的用户体验。希望本文对你有所帮助!