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