JNI开发
看了看时间,整整折腾一天才跑成功一个demo。内心又几乎奔溃,Android这个NDK能不能别乱动,哪怕是就隔不到1年都不兼容了。Android最操蛋的也就是这个了,API不稳定。尽管官方已经极力的在维护,早干嘛去了。
Android一个重要的开发方向JNI开发,使用JNI接口可以完成Java代码对C/C++代码的调用,一般C/C++用来实现比较复杂的算法处理,比如图像、音视频的处理。这些用C/C++在底层运行速度比Java快多了。而且通用性比较强只需用C/C++写一份代码Java也可以直接调用。
1、JNI加密不可破解,安全性比Java层高
2、C/C++底层操作更容易
3、C/C++效率更高,执行算法,视频处理等
4、跨平台、可移植性强
1、NDK环境搭建
使用Androidstudio很简单,不像以前还得单独下载解压,现在都集成好了。没有直接下载就行了。

在项目中别忘了配置,右键项目,打开Open Module Settings,可能有些不会自动给你配置好NDK,需要手动设置版本,遇到问题先看看这里配置了没。

2、创建Native C++项目
最简单的方式,直接使用AndroidStudio的模板创建一个Native C++项目:

勾选默认的或者选一个C++14即可:

创建好的目录会自动生成一个示例native-lib.cpp以及一个编译CPP需要的CMakeLists.txt。

该项目的build.gradle中需要配置以下内容,CMakeLists.txt就是在src/main/cpp目录下
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}3、创建JNI接口
既然知道上面的JNI项目结构,那么也可以在已有的项目中直接创建JNI接口。
①创建src/main/cpp目录
该文件夹用来存放C/C++源文件和CMake配置文件
②CMakeLists.txt
按照下面的标准格式,生成的库名,添加源文件,及其它配置
# 有关在Android Studio中使用CMake的更多信息,
# 请阅读文档:https://d.android.com/studio/projects/add-native-code.html
# 设置构建本机库所需的CMake最低版本。
cmake_minimum_required(VERSION 3.4.1)
# 创建并命名一个库,将其设置为STATIC或SHARED,并提供其源代码的相对路径。
# 您可以定义多个库,CMake会为您构建它们。
# Gradle会自动将共享库与您的APK打包在一起。
add_library( # Sets the name of the library.
hello
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
hello.cpp)
# 搜索指定的预构建库并将路径存储为变量。
# 由于CMake默认情况下在搜索路径中包括系统库,
# 因此您只需要指定要添加的公共NDK库的名称即可。
# CMake在完成其构建之前会验证该库是否存在。
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
# 指定库CMake应该链接到您的目标库。
# 您可以链接多个库,例如您在此构建脚本中定义的库,
# 预构建的第三方库或系统库。
target_link_libraries( # Specifies the target library.
hello
# Links the target library to the log library
# included in the NDK.
${log-lib})③build.gradle配置
加上这几行externalNativeBuild配置就行了
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}④创建C/C++源文件
方法名一定要按照Java_包名_Activity名_函数名
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_androidstudio_activity_other_NativeActivity_helloWorld(JNIEnv *env,jobject /* this */){
std::string hello = "hello Quibbler";
return env->NewStringUTF(hello.c_str());
}⑤Activity中声明native方法
public native String helloWorld();⑥加载native库
libname就是C/C++源文件名
static {
System.loadLibrary("hello");
}4、各种坑
一天尽遇到各种玄学大坑,难道这么多年都没人踩吗?我真是“锦鲤”,总能遇到各种问题。
4.1、CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
去掉 app/build.gradle ndk{} 里面的 'armeabi' 试试

试了,不管用。而且这个ndk{ }配置是不是已经废弃了,我添加到build.grable一堆报错,现在改用cmake{ }

