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

相关推荐
chjif6 分钟前
Android 设备管控开发实战:自定义 Launcher 如何只显示指定 App?
android·kotlin
Dovis(誓平步青云)27 分钟前
模拟器横评:电脑上看小说、追短剧用什么模拟器?MuMu、雷电、腾讯手游助手实测
android·java·服务器·前端·javascript·电脑
非凡ghost1 小时前
用 Kotlin 和 Jetpack Compose 重写的安卓视频播放器,原生体验有多流畅?
android·java·kotlin·音视频·软件需求
峥嵘life1 小时前
Android16 系统 APEX 模块调试总结
android·大数据·开发语言
亘元有量-流量变现1 小时前
2026安卓ASO增量攻略:摆脱iOS思维依赖,吃透多商店自然免费流量
android·aso优化·亘元有量·方糖试玩
一航jason2 小时前
安卓车机端 AIOS 技术生态全景
android·人工智能·ai·ai编程·ai-native
深念Y2 小时前
ZTE B860AV1.1-T2 机顶盒改造记录:从 Android 到 Linux 服务器
android·linux·运维·服务器·boot·cma·机顶盒
淡淡的香烟3 小时前
Android中tcp的通信
android·物联网·tcp/ip
Escalating_xu4 小时前
【C++入门基础(下)】默认参数、函数重载、引用、inline 与 nullptr
android·c++·redis
wen_zhufeng15 小时前
用 vLLM 加速 TTS 推理:通用改造指南
android·vllm