Android NDK开发入门

目录

  • [1. 创建 C++ 代码](#1. 创建 C++ 代码)
  • [2. 定义 JNI 接口](#2. 定义 JNI 接口)
  • [3. 在 Java 中声明本地方法](#3. 在 Java 中声明本地方法)
  • [4. 创建 CMakeLists.txt 文件](#4. 创建 CMakeLists.txt 文件)
  • [5. 配置 build.gradle](#5. 配置 build.gradle)
  • [6. 编译和运行](#6. 编译和运行)
  • 7.项目结构
  • 8.总结

在 Android 开发中,编写 JNI (Java Native Interface) 接口使得应用层能够调用 C++ 代码,涉及到几个步骤:创建 C++ 代码、定义 JNI 接口、编写 Java 代码以加载本地库并调用这些接口。下面是一个详细的步骤说明。

1. 创建 C++ 代码

首先,需要在 Android 项目中添加一个 C++ 源文件,并在其中定义一个本地方法。

示例 C++ 代码 (native-lib.cpp)

c 复制代码
#include <jni.h>
#include <string>

// 声明一个 JNI 函数
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

2. 定义 JNI 接口

在 C++ 代码中,JNIEXPORT 和 JNICALL 是 JNI 规范中的宏,用于确保函数在不同平台上都能正确调用。Java_com_example_myapplication_MainActivity_stringFromJNI是一个由 JNI 规范定义的命名规则,它的含义如下:

Java_: 所有 JNI 函数的前缀。

com_example_myapplication_MainActivity: 包名和类名,用于标识这个本地方法是属于哪个 Java 类的。

stringFromJNI: Java 方法的名字。

3. 在 Java 中声明本地方法

在 kotlin 类中声明一个与 C++ 中定义的 JNI 函数相对应的 native 方法。

kotlin 复制代码
package com.example.myapplication

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


import android.widget.TextView


class MainActivity : AppCompatActivity() {

    // 声明一个 native 方法
    external fun stringFromJNI(): String?

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 加载 native 库
        System.loadLibrary("native-lib")

        // 调用 native 方法
        // 调用 native 方法
        val message = stringFromJNI()
        val tv = findViewById<TextView>(R.id.tv_content)
        tv.text = message
    }
}

4. 创建 CMakeLists.txt 文件

为了让 Android Studio 构建你的 C++ 代码并生成 .so 库文件,你需要在项目中创建 CMakeLists.txt 文件。

示例 CMakeLists.txt

bash 复制代码
# 设置最低支持的 CMake 版本
cmake_minimum_required(VERSION 3.4.1)

# 添加 C++ 源文件并指定生成的库名
add_library(native-lib SHARED ../app/src/main/cpp/native-lib.cpp )

# 打开可以过滤只生成64位的arm64-v8a CUP库
# set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a")


# 链接目标库
find_library( log-lib log )
target_link_libraries( native-lib ${log-lib} )

5. 配置 build.gradle

确保你的 Android 模块的 build.gradle 文件配置了 CMake 支持。

示例 build.gradle

xml 复制代码
android {
    compileSdk 34

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 21
        targetSdk 34
        versionCode 1
        versionName "1.0"

        ndk {
            abiFilters "arm64-v8a"  // 只生成64位库
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    ndkVersion '27.0.12077973'
}

6. 编译和运行

完成以上步骤后,Android Studio 会根据 CMakeLists.txt 文件构建 C++ 代码并生成 .so 库。你可以编译并运行项目,JNI 接口应正常工作。

生成的 .so 文件通常会位于 app 模块的 build 目录下。具体路径如下:

xml 复制代码
app/build/intermediates/cmake/{buildType}/obj/{abi}/

7.项目结构

8.总结

通过这些步骤,你可以在 Android 中编写 JNI 接口,利用 C++ 代码处理复杂的逻辑或执行高性能计算,并在 Java 应用层调用这些 C++ 方法。JNI 是 Android 开发中一个强大的工具,可以将 Java 和 C++ 代码无缝集成。

相关推荐
阿巴斯甜18 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker19 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952720 小时前
Andorid Google 登录接入文档
android
黄林晴21 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android