美文网首页NDK
NDK开发(一)--第一个NDK工程

NDK开发(一)--第一个NDK工程

作者: 骑着蜗牛闯世界666 | 来源:发表于2019-11-22 00:04 被阅读0次

    介绍

    1、NDK

    NDK是Native Development Kit的缩写,它不是一个单独的工具,而是一个包含API、交叉编译器、链接程序、调试工具、构建工具、文档和示例等的综合工具。它的作用是快速开发C/C++动态库,并自动将动态库和应用打包到apk中。

    2、JNI

    JNI是Java Native Interface的缩写,即Java 本地接口,作用是Java 跟本地其他语言(C/C++)进行交互。

    示例

    1、环境

    -w100

    打开Tool-SDK Manager,选择Android SDK,下载上面红色框响应的资源。

    【LLDB】:C/C++的调试工具
    【CMake】:跨平台的编译工具
    【NDK】:开发需要用到的工具集

    2、工程创建

    Android Studio已经支持在创建工程的时候,就支持NDK的相关能力。


    -w1012

    点击“New Project”,选择“Native C++”,其他的默认即可,这样子AS就能够创建一个通用的包含NDK能力的工程。


    -w1552
    跟普通工程的差别,就是新增加了上面左边的几个文件/夹,并且在build.gradle新增了相关配置。
    这里介绍一下调用的流程和相关文件的作用。
    • MainActivity
    public class MainActivity extends Activity {
    static {
        System.loadLibrary("native-lib");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    setContentView(R.layout.activity_main);
    TextView tv = findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());}
    public native String stringFromJNI();
    }
    

    在MainActivity类开始加载的时候,先执行静态代码块的内容,System.loadLibrary("native-lib");是加载一个名字为"native-lib"的so文件。在文件的最底下,public native String stringFromJNI();声明了一个名称为"stringFromJni"的方法,其中"native"是对应的关键字。

    • CMakeList.txt

    NDK开发的相关配置。各个命令相关的含义如下:

    # 设置cmake使用的最低版本,如果用到了高版本的特性,
    #这里需要进行设置,如果没有,也可以忽略不写。
    cmake_minimum_required(VERSION 3.4.1)
    #第一个参数 创建一个名称为 native-lib 的动态库,会生成 native-lib.so 文件;
    #第二个参数 SHARED 的意思是声明这个库为动态库,另外一种是静态库,STATIC 表示。
    #第三个参数是指定这个库使用到的源代码文件
    #另,可以使用多个 add_library,来构建更多的库文件。
    add_library(native-lib SHARED native-lib.cpp)
    # 查找名字为log 的 NDK库,将这个库的路径存储在变量中。
    # 这里的意思就是找到 NDK 中的 log 库,并将其路径存储在 “log-lib” 变量中,
    # 在后面就可以通过 “${log-lib}” 命令取出变量中的值
    find_library(log-lib log)
    #将我们的so 库和 log 库链接起来
    target_link_libraries(native-lib ${log-lib})
    
    • native-lib.app
    #include <string>
    extern "C" JNIEXPORT jstring JNICALL
    Java_com_canter_ndkdemo1_MainActivity_stringFromJNI(
            JNIEnv *env, 
            jobject /* this */) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
    

    native方法的实现,在java调用的stringFromJni最终会执行到这里,并返回对应的数据。

    • build.gradle
    externalNativeBuild {
        cmake {
           path "src/main/cpp/CMakeLists.txt"
        }
    }
    

    指定CMakeLists的位置,将NDK和gradle关联起来。

    3、运行

    -w300

    执行 "RUN"操作之后,应用程序就能够从so中获取对应的数据进行展示了。整个执行流程:

    1、gradle按照我们配置的路径,调用执行cmakelist.txt脚本
    2、cmake按照配置,将源文件编译到共享库中,并命名为libnative-lib.so,之后一并打包到apk中;
    3、在运行的时候,首先执行静态代码块的内容,加载对应的so.
    4、调用对应的jni方法,so里面的实现就会返回对应的数据给到JAVA层,进行展示。

    相关文章

      网友评论

        本文标题:NDK开发(一)--第一个NDK工程

        本文链接:https://www.haomeiwen.com/subject/fjoxwctx.html