Native Development Kit 原生开发工具包,支持C/C++
1、NDK优缺点
2、一步一步实现
简介:https://juejin.im/post/6844904031509282829
1、在main下新建cpp文件夹(与java文件夹平级),放入.cpp和.h以及1个CMakeLists.txt文件
如果cpp文件中其实使用c语言实现的,那么.h中的每个函数前都用extern “C” ;
如果不止一个cpp文件,那么CMakeLists.txt中:
add_library(rsa // 最终生成的库名称为librsa.so
SHARED // 生成的是动态链接库
rsa_A.cpp keysInit_A.cpp bn_A.cpp)//这里并排写
2、在build.gradle中重新指定CMakeLists.txt的路径
android {
...
externalNativeBuild {
cmake {
// path "CMakeLists.txt"
path "src/main/cpp/rsa/CMakeLists.txt"
}
}
...
3、点击Android Studio右侧的Gradle窗口中,指定module的externalNativeBuildRelease任务(也可以gradlew执行命令)。执行成功后,我们就能在app/build/intermediates/cmake/release/obj/目录下看到生成的动态库文件,应该会有4个文件夹:arm64-v8a, armeabi-v7a, x86, x86_64。
4、到cpp文件夹下新建native-lib.cpp文件
暂时不写入内容,但是后面会写的
5、到main下新建jniLibs文件夹,将上述4个文件夹剪切到jniLibs文件夹中,文件夹名称一定只能是jniLibs。
6、 在app文件夹下新建CMakeLists.txt,配置依赖的动态库
cmake_minimum_required(VERSION 3.4.1)
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp)
find_library(
log-lib
log)
set(rsa-lib ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${CMAKE_ANDROID_ARCH_ABI}/librsa.so)
message("rsa-lib is ${rsa-lib}")
target_link_libraries(
native-lib
${rsa-lib}
${log-lib})
7、在app的build.gradle中切换回步骤5建立的CMakeLists.txt`
...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
// path "src/main/cpp/rsa/CMakeLists.txt"
}
}
...
8、点击Android Studio右侧的Gradle,选择工程名,app, Tasks, other, 指定externalNativeBuildRelease任务(也可以gradlew执行命令),出现下列字样,表明编译成功:
> Task :app:externalNativeBuildRelease
Build native-lib_armeabi-v7a
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\armeabi-v7a'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\armeabi-v7a\libnative-lib.so
Build native-lib_arm64-v8a
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\arm64-v8a'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\arm64-v8a\libnative-lib.so
Build native-lib_x86
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\x86'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\x86\libnative-lib.so
Build native-lib_x86_64
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\x86_64'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\x86_64\libnative-lib.so
BUILD SUCCESSFUL in 23s
2 actionable tasks: 2 executed
15:23:30: Task execution finished 'externalNativeBuildRelease'.
9、在MainActivity.java中定义native函数并调用:
public native String getABI();
......
Log.i(TAG, "onCreate: getABI = " + getABI());
......
10、在MainActivity中添加静态类:
public class MainActivity extends AppCompatActivity {
...
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
...
}
11、在module的build.gradle中进行配置,以指定ABI运行
android{
...
defaultConfig{
...
ndk{
// abiFilters "armeabi-v7a" // 指定以armeabi-v7a运行
abiFilters "arm64-v8a","armeabi-v7a" // 以arm64-v8a、armeabi-v7a中,目标设备支持的最优ABI运行
// abiFilters "arm64-v8a" // 指定以arm64-v8a运行
}
...
}
...
}
12、native函数:
#include <jni.h>
#include "abi/abi.h"
extern "C" JNIEXPORT jstring
JNICALL
Java_com_wsy_jnidemo_MainActivity_getABI(
JNIEnv *env,
jobject /* this */) {
return env->NewStringUTF(getAbi());
}