Android NDK开发入门

embedded/2024/10/19 0:20:43/

目录

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

在 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.myapplicationimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundleimport android.widget.TextViewclass 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 34defaultConfig {applicationId "com.example.myapplication"minSdk 21targetSdk 34versionCode 1versionName "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++ 代码无缝集成。


http://www.ppmy.cn/embedded/96194.html

相关文章

[LitCTF 2024]exx

[LitCTF 2024]exx 点开之后页面如图所示&#xff1a; 随便输入一个用户名试试&#xff1a; 发现回显失败&#xff0c;我们点击鼠标右键查看页面源码&#xff1a; 这里展示了如何使用jQuery发起AJAX请求&#xff0c;并处理XML格式的请求和响应。 而XXE注入的最明显特征包括&…

Qt动画效果、动画曲线

Qt动画效果 QPropertyAnimation *animation new QPropertyAnimation(labelWin, "geometry",this); // 创建胜利标签动画animation->setStartValue(labelWin->geometry()); // 设置动画的起始位置animation->setEndValue(QRect(labelWin->x(), labelW…

基于Spring Boot的高效宠物购物平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

RestTemplate 常用方法

RestTemplate 是Spring提供的一个用于同步客户端HTTP访问的类&#xff0c;它是Spring RestClient 接口的一个实现。RestTemplate 提供了一系列方法来支持不同类型的HTTP操作。以下是一些常用的RestTemplate方法&#xff1a; 1. **GET请求**&#xff1a; - getForObject(Str…

centos7卸载docker报错No Packages marked for removal

执行&#xff1a; yum -y remove docker* 报错&#xff1a; No Packages marked for removal 执行&#xff1a; yum list installed | grep docker yum remove -y docker-ce.x86_64 docker-ce-cli.x86_64 containerd.io.x86_64

融合创新:EasyCVR视频汇聚平台云计算技术与AI技术共筑雪亮工程智能防线

随着信息技术的飞速发展&#xff0c;视频云计算技术作为云计算领域的一个重要分支&#xff0c;正逐步在公共安全、社会治理等领域展现出其独特的优势。特别是在雪亮工程这一群众性治安防控工程中&#xff0c;视频云计算技术更是发挥了不可替代的作用。本文将从视频云计算技术的…

HTTP 之 请求方法(三)

1. GET&#xff1a;请求指定的资源。 GET 请求应该只用于获取数据&#xff0c;而不会导致服务器上的状态变化。 //通常用于请求页面或数据。 fetch(http://www.example.com/data).then(response > response.json()).then(data > console.log(data)).catch(error > con…

Unity求向量和平面的交点

已知条件&#xff1a;平面P的法向量&#xff0c;平面上的一点P0&#xff0c;直线L的方向向量&#xff0c;直线上的一点L0 公式推导&#xff1a; 主要是两点&#xff1a; 1.目标点T在直线上&#xff1a;TL0D*&#xff08;D未知&#xff09; 2.目标点T在平面上&#xff0c;则T…