Android Studio2.2以后取代了原先的jni文件夹和mk文件,取代的是cpp文件夹,采用新的cmake编译方式,大大的简化了以前复杂的jni开发流程。
1)先说下官方提供的最简单的JNi开发,ndk的配置肯定是需要,但是还需要添加另外两个配置,可以直接在Setting-System Setting-Android SDK直接下载cmake和LLDB(NDK调试工具)
2)新建工程,跟一般项目不一样,在configure your new project时需要勾上Include C++ support
3)中间步骤就是一直选择next就可以,但是在Customize C++ Support选项卡中,可以进行对以下属性进行配置:
- C++ Standard:点击下拉框,可以选择标准 C++,或者选择默认 CMake 设置的 Toolchain Default 选项。
- Exceptions Support:如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的cppFlags 中添加 -fexcetions 标志。
- Runtime Type Information Support:如果你想支持 RTTI,那么就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的cppFlags 中添加 -frtti 标志
4)生成的项目列表如下
c++文件放在cpp文件夹,比如这里为native-lib.cpp文件,CMakeLists.txt文件在app目录下,在gradle中对于cmakelists文件路径进行了配置,对整个项目进行Make Project,就可以自动生成.so文件,如下图所示:
在图左侧中生成了一个cmake的文件夹,由于没有在gradle中配置CPU类型,这里生成不同类型的.so文件。在Java文件中通过System.loadLibrary导入了so文件,并且书写了native方法来调用c++代码。
先了解cmakeLists文件的配置,方便于了解so文件的生成,
cmake_minimum_required(VERSION 3.4.1) #cmake的版本声明add_library(native-lib SHARED src/main/cpp/native-lib.cpp) #编译目标cpp文件生成so文件 add_library(lib_jni SHARED #动态库 IMPORTED)set_target_properties(lib_jni PROPERTIES IMPORTED_LOCATION
set(SOURECEDIR ${CMAKE_SOURCE_DIR}/..)#给变量设定指定值
${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/lib_jni.so) #添加第三方提供的so文件
target_include_directories(native-lib PRIVATE ${jni-dir}/include) #配置所需头文件的路径target_link_libraries(lib_jni
native-lib) #设置所有需要链接库的名称(包括静态库和动态库)
native-lib.cpp文件中的代码比较简单,这里简单说明下
#include <jni.h> //导入头文件 #include <string> extern "C" //jni中方法都是用c方式定义的,这里采用的c++文件,加入这段,表示这部分代码按C语言编译 JNIEXPORT jstring JNICALL //固定编写格式 其中jstring为返回类型,代表的是java里的string类型 Java_hiar_myapplication_MainActivity_stringFromJNI( //Java_包名_类名_方法名 JNIEnv *env, jobject /* this */) { //除了java方法传递过来的参数,还需要包含这两个参数 std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); //输出字符串 }