添加 C/C++ 支持
前面我们新建工程时选择支持 C/C++。如何给现有项目添加 C/C++ 支持呢?
添加步骤
以 Tutorial2020 工程为例。我们给它手动添加 NDK。
工程中有一个 app 模块。往这个模块中添加 NDK。
添加 cpp 目录
在 app/src/main 目录下,新建 cpp 目录,其与 java 同级。
在 cpp 目录中新建文件 fisher-lib.cpp
。目前这个文件还是空的,后面再添加代码。
新建 native 方法
新建 CalUtil
类,里面定义 native 方法。
package com.rustfisher.tutorial2020.cal;
public class CalUtil {
public native int getNumber();
public native String getMsg();
}
添加 cmake 配置
在 cpp 目录中新建 CMakeLists.txt
文件。
使用 add_library
方法进行配置。库名叫做 fisher-lib
。
cmake_minimum_required(VERSION 3.4.1)
add_library( # Specifies the name of the library.
fisher-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
fisher-lib.cpp )
此时 cmake 还没有起作用。从 as 中可以看出字体都还是灰色。我们还需要配置 gradle。
配置 gradle
仿照之前的新建工程,添加 gradle 配置 externalNativeBuild
。指定 cmake 的路径和版本。
android {
defaultConfig {
// 要添加的部分
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
// 要添加的部分
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
}
sync 后可以发现 CMakeLists.txt
的代码已经有颜色了。
实现 cpp
现在 gradle 和 cmake 已经配置完毕,我们来实现 cpp 代码。
CalUtil 中有 2 个 native 方法,方法签名前缀是 Java_com_rustfisher_tutorial2020_cal_CalUtil_
。
当我们输入 g
时,as 会智能提示出我们想要的方法名。十分便利。
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_rustfisher_tutorial2020_cal_CalUtil_getMsg(JNIEnv *env, jobject thiz) {
std::string hello = "欢迎来到Tutorial";
return env->NewStringUTF(hello.c_str());
}
extern "C" JNIEXPORT jint JNICALL
Java_com_rustfisher_tutorial2020_cal_CalUtil_getNumber(JNIEnv *env, jobject thiz) {
return 2020;
}
这里遇到一个 as 的问题,编写好 cpp 代码后,会有红线提示代码错误。但是直接运行项目又是正常的。
重新打开一次这个工程,红线就不见了。点击左边的图标,可以跳转到对应的 Java 方法。
调用方法
调用这 2 个方法。
private CalUtil mCalUtil = new CalUtil();
// ....
mCalUtil.getMsg();
mCalUtil.getNumber()
至此给现有项目添加 NDK 完毕。
小结
- 添加 cpp 目录
- 在 cpp 目录中添加 cmake
- 在 gradle 中配置 cmake
- 新建 native 方法
- 编写 cpp 实现方法
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于