本文目录
一Androidstudio中需要的插件
二项目配置
①build.gardle配置
②CMakeLists.txt
③Android和Cpp的代码
④so文件生成
⑤so文件的位置
一、Android studio中需要的插件:
CMake
LLDB
NDK
二、项目配置
①build.gardle的配置
多了两个externalNativeBuild :defaultConfig下的、和defaultConfig 并行下的externalNativeBuild
a、defaultConfig下的externalNativeBuild
defaultConfig { ... externalNativeBuild { cmake { cppFlags "" //cppFlags "-fexceptions -frtti" ,在AndroidStudio新建项目->选择C++版本时,勾选•Exceptions Support和•Runtime Type Information Support时会有, } } }
注:
Exceptions Support:支持C++异常处理
Runtime Type Information Support:支持运行时类型识别, 程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型
b、和defaultConfig 并行下的externalNativeBuild ,用于指定CMakeLists.txt的路径
externalNativeBuild { cmake { path "CMakeLists.txt" } }
②CMake的构建脚本
# 设置Cmake最小版本 cmake_minimum_required(VERSION 3.4.1) # 编译library add_library( # 设置library名称 native-lib # 设置library模式,SHARED模式会编译so文件,STATIC模式不会编译 SHARED # 设置原生代码路径 src/main/cpp/native-lib.cpp ) # 定位library find_library( # library名称 log-lib # 将library路径存储为一个变量,可以在其他地方用这个变量引用NDK库 # 在这里设置变量名称 log )
# 关联library target_link_libraries( # 关联的library native-lib # 关联native-lib和log-lib ${log-lib} )
③Cpp代码和Android代码调用
Cpp代码:
#include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_yl_ndkdemo_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); }
Android代码:
public class MainActivity extends AppCompatActivity { // 加载native-lib,不加lib前缀 static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 将获取的字符串显示在TextView上 TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(stringFromJNI()); } /** * native-lib中的原生方法 */ public native String stringFromJNI(); }
④so文件的生成
在CMakeLists.txt中将library的编译模式设置为SHARED模式,点击AS的编译按钮,在app > build > intermediates > cmake > debug > obj目录下会生成不同CPU架构对应的so文件
不同架构的指定:
defaultConfig { ... ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64", "mips", "mips64" } }
⑤so文件的位置
在项目的app > src > main目录下创建jniLibs文件夹,将生成的so文件(带着CPU架构目录)拷贝到jniLibs文件夹中
参考:https://blog.csdn.net/kong_gu_you_lan/article/details/79091789