美文网首页
jni新手笔记一:ndk编译

jni新手笔记一:ndk编译

作者: DON_1007 | 来源:发表于2019-03-21 14:11 被阅读0次

    Android Studio 2.2 及之后的版本,支持NDK编译c/c++代码

    准备工作:

    下载NDK,使用SDK Manager 下载 LLDBCMakeNDK

    image.png

    新建工程ndkdemo

    1、添加c++ 源码

    创建完工程之后,可以在Java源码同级目录新建文件夹,c++源码可以放在这个目录下。这个文件夹的创建位置不是固定的,可以创建在工程的任意有效路径内,只要CMakeLists.txt 或者 Android.mk 文件配置的源码位置是正确的即可。

    image.png

    ndk目录下新建c++文件 hello.cpp

    //
    // Created by Don on 2019-03-20.
    //
    
    #ifndef NDKDEMO_HELLO_H
    #define NDKDEMO_HELLO_H
    
    char *getHello();
    
    #endif //NDKDEMO_HELLO_H
    
    
    //
    // Created by Don on 2019-03-20.
    //
    
    #include "hello.h"
    
    char *getHello() {
        return "hello";
    }
    

    使用ndk编译c/c++文件,有两种方式,CMakeAndroid.mk

    2、添加CMake编译脚本

    创建CMakeLists.txt,此文件可以创建在工程内任意有效的路径内,这里将其创键在主module app目录下。

    添加 cmake_minimum_requiredadd_library
    add_library中可以指定库名,最终生成的库名为 lib库名.so
    为了确保 CMake 可以在编译时定位您的标头文件,您需要将include_directories命令添加到 CMake 构建脚本中并指定标头的路径

    cmake_minimum_required(VERSION 3.4.1)
    
    add_library( 
                 # 库名
                 hello
    
                 # 动态库 so
                 SHARED
    
                 # c/c++ 源文件
                 src/main/ndk/hello.cpp )
    
    # c/c++ 头文件
    include_directories(src/main/ndk/)
    

    CMakeLists.txt文件创建好以后,就可以在gradle文件指定ndk编译类型及编译脚本路径

    android {
        ...
        externalNativeBuild {
              cmake{
                  path "CMakeLists.txt"
              }
          }
    }
    

    运行appAndroid Studio会生成so文件并将so文件打包到apk内,使用Android Studio打开apk文件,可以在lib目录下看到so

    image.png

    编译生成的so文件可以在build目录下找到

    image.png

    3、 Android.mk

    使用Android.mk 编译与CMake类似的,也需要指定库名,库类型和c/c++源文件

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    # 库名
    LOCAL_MODULE    := hello
    
    # c/c++ 源文件
    LOCAL_SRC_FILES := hello.cpp
    
    # 动态库 so
    include $(BUILD_SHARED_LIBRARY)
    

    指定编译方式为Android.mk

       externalNativeBuild {
           ndkBuild {
                path 'Android.mk'
            }
        }
    

    参考:
    Getting Started with the NDK

    相关文章

      网友评论

          本文标题:jni新手笔记一:ndk编译

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