Android NDK开发入门


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

1. 创建 C++ 代码

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

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

#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 方法。

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

# 设置最低支持的 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

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 目录下。具体路径如下:

app/build/intermediates/cmake/{buildType}/obj/{abi}/

在这里插入图片描述

7.项目结构

在这里插入图片描述

8.总结

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

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值