使用NDK编译原生库或可执行应用程序

image

背景

  • Android Studio: 3.6.1
  • Win10 X64

项目需要编译JNI原生库接口

步骤

安装配置NDK

  1. 使用SDK Manager下载安装NDK
    在Android Studio打开Setting->Android SDK->SDK Tools,勾选NDKLLDB,点击应用,开始下载安装,完成之后会在SDK的目录下看到ndk和lldb两个文件夹
  2. 添加ndk的路径到环境变量

编译

  1. 参考现有的JNI工程新建一个源码目录jni
  2. 新建或修改jni目录中的Android.mk,Application.mk文件
    Application.mk文件参考:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # "armeabi-v7a" , "x86" , "arm64-v8a" , "x86_64" , "all"
    #APP_ABI := all

    APP_ABI := armeabi-v7a arm64-v8a

    # Workaround for MIPS toolchain linker being unable to find liblog dependency
    # of shared object in NDK versions at least up to r9.
    APP_PLATFORM := android-19

    #APP_CFLAGS -std=c99
    #APP_CPPFLAGS -std=c++11

    # stlport_static; stlport_shared;
    # gnustl_static: 使用 GNU libstdc++ 作为静态库
    APP_STL = gnustl_static


    APP_LDFLAGS += -llog -pie -fPIE
    APP_CFLAGS += -pie -fPIE -lpthread -lutils -lcutils
    APP_CPPFLAGS += -std=c++11
    # debug release
    APP_OPTIM := debug

    Android.mk文件参考:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    LOCAL_PATH:= $(call my-dir)

    APP_LIBMIDAVSERVER_V3 := $(LOCAL_PATH)/..

    #print log
    $(warning 'current path: ', $(APP_LIBMIDAVSERVER_V3))

    ##############

    include $(CLEAR_VARS)

    # 添加源文件
    LOCAL_SRC_FILES := \
    $(APP_LIBMIDAVSERVER_V3)/src/test.cpp

    #添加头文件所在目录
    LOCAL_C_INCLUDES += \
    $(APP_LIBMIDAVSERVER_V3)/..


    #导出动态库的头文件
    LOCAL_EXPORT_C_INCLUDES := \
    $(APP_LIBMIDAVSERVER_V3)/include

    #链接编译选项
    LOCAL_CFLAGS := -Wno-error=format-security -Wall -O2 -fPIC -DLINUX -DCRYPTO -DUSE_POLARSSL -DDEBUG

    #链接依赖库
    # LOCAL_LDFLAGS += -L$(APP_LIBMIDAVSERVER_V3)/lib/$(TARGET_ARCH_ABI) -lavformat -lpolarssl -lJson

    LOCAL_MODULE := ndktest
    LOCAL_MODULE_PATH := $(APP_LIBMIDAVSERVER_V3)/bin

    # "PREBUILT_SHARED_LIBRARY" "BUILD_EXECUTABLE" "BUILD_SHARED_LIBRARY"
    include $(BUILD_EXECUTABLE)
  3. 控制台进入jni目录,运行ndk-build进行编译

  4. 运行测试(可选)
    1
    2
    3
    4
    # adb remount
    # adb push ndktest /system/bin/
    # adb shell
    xxx:/ # ndktest

注: 如果需要在Android Studio中调试,可参考下面的Google官方文档,使用Gradle关联CMake或 ndk-build 脚本文件

参考

  1. NDK 入门指南
Donate comment here