一、android studio的ndk环境搭建
1、下载安装包
File-setting-Appearance&Behavior-System Settings-Android SDK-SDK Tools
找到NDK Cmake选项并选中,点击Apply,会下载对应的安装包。
2、配置路径
File-Project Structure-SDK Location配置下载的NDK的路径
D:\software\sdk\ndk\21.0.6113669
(这个是我ndk下载存放的目录,路径一定要带上ndk的版本号,如果遇到手动选路径不可点击的情况,就要去local.properties文件中,手动添加
sdk.dir=D:\software\sdk
ndk.dir=D:\software\sdk\ndk\21.0.6113669)
二、新建一个C++的工程
File-new-New Project 选择 native C++ ,点next,生成C++工程,直接运行,会出现Hello from C++ 的提示语,这就是java直接调用本地C++代码的Demo。
下面是C++代码的实现部分,也是后面编译成so文件的核心代码
//#include <jni.h>
//#include <string>
//extern "C" JNIEXPORT jstring JNICALL
//Java_com_kn_ctest_MainActivity_stringFromJNI(
// JNIEnv* env,
// jobject /* this */) {
// std::string hello = "Hello from C++12567";
// return env->NewStringUTF(hello.c_str());
//}
三、CMake编译生成so文件
Build-Make Project 就会在app/build/intermediates/cmake/debug/obj 目录底下生成
armeabi-v7a arm64-v8a x86 x86_64四个文件,以及对应平台的libxxx.so文件(xxx默认就是新建项目的名称,比如我的叫CTest,对应的so文件名就叫libctest.so)
(每次build-make project 的时候,要先删除jniLibs文件夹下的so文件,否则会报错
If you are using jniLibs and CMake IMPORTED targets, see )
四、调用.so及其方法
1、新建jniLibs文件
在app-src-main目录底下,新建一个jniLibs文件,将app/build/intermediates/cmake/debug/obj 生成的armeabi-v7a文件一块拷贝过来。
2、gradle配置jniLibs
gradle的android{}中 配置
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
并注释掉 (不注释掉,会导致调用stringFromJNI方法,调用不到so的方法,而是本地c++的方法)
// externalNativeBuild {
// cmake {
// path file('src/main/cpp/CMakeLists.txt')
// version '3.18.1'
// }
// }
Sync Now一下
3、调用so方法
在要调用C++的activity中,添加so文件加载方法
static {
System.loadLibrary("ctest");
}
调用C++中声明的方法:
tv.setText(stringFromJNI());
public native String stringFromJNI();//该方法一定要和C++中声明的方法一样,而且包名路径都要一样,否则会调用失败的。
直接运行,android调用自己ndk编译的so文件,就成功了,soEasy!!!