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++ 代码无缝集成。

相关推荐
Android-Flutter1 天前
android compose 知识点
android·compose
其实防守也摸鱼1 天前
Codex 下载与本地部署实战:从安装到运行全指南
android·大数据·运维·安全·自动化
ttyyttemo1 天前
协程并发执行与共享状态
android
miaowmiaow1 天前
我让 AI 给老项目做了一次分层架构升级:对标 Now in Android,从「穿层」到「端口与适配器」
android·ai编程·deepseek
mmsx1 天前
Android 栅格数据缓冲区的类型包装:用匿名子类破解泛型擦除
android·地图·栅格
叶羽西1 天前
Android Camera HAL调整图像处理线程优先级
android
HouWan1 天前
Flutter: MediaQuery.of(context) 为什么可能拖慢页面?
android·flutter·ios
事圆则缓1 天前
Android 图片内存到底怎么算
android
Godikov1 天前
弱网环境离线优先:Android 终端数据可靠同步架构实战
android