jni新手笔记一:ndk编译

96
DON_1007
2019.03.21 14:11* 字数 435

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

Android