Palingenesis 2019-06-27
Android NDK是Android软件开发包(SDK)的相关工具集,用来扩展Android SDK的功能,从而使开发人员能够使用机器代码生成的编程语言(如C、C++和汇编语言)实现一些对代码性能要求较高的模块,并将这些模块嵌入到Android应用程序中使用。
Android NDK是Android软件开发包(SDK)的相关工具集,用来扩展Android SDK的功能,从而使开发人员能够使用机器代码生成的编程语言(如C、C++和汇编语言)实现一些对代码性能要求较高的模块,并将这些模块嵌入到Android应用程序中使用。
NDK 不适用于大多数初学的 Android 编程者,对许多类型的 Android 应用没什么价值。 因为它不可避免地会增加开发过程的复杂性,所以通常不值得使用。 但如果您需要执行以下操作,它可能很有用:
Android NDK不是一个单独的工具,他是一个包含API、交叉编译器、链接程序、调试器、构建工具、文档和示例应用程序的综合工具集。以下是Android NDK的一些主要组件:
Android NDK组件都被安装在NDK的根目录下,下面介绍一些重要的文件和子目录。
ndk-build:ndk-build 脚本用于在 NDK 中心启动构建脚本,这些脚本:
在java中声明Native方法
public native String hello();
在jni目录中实现原生方法
在jni目录中创建c/c++文件,并实现对应的方法。
#include <jni.h> #include <stdio.h> #include <stdlib.h> extern "C" JNIEXPORT jstring JNICALL Java_cn_com_codeteenager_ndkone_MainActivity_hello(JNIEnv *env, jobject obj) { return env->NewStringUTF("Hello World"); }
添加Android.mk文件。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := helloworld LOCAL_SRC_FILES := HelloWorld.cpp LOCAL_C_INCLUDES += $(LOCAL_PATH) #LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
添加Application.mk文件。
# 指定生成哪些cpu架构的库 APP_ABI := armeabi-v7a # 此变量包含目标 Android 平台的名称 APP_PLATFORM := android-22
通过命令行打开jni目录,然后执行ndk-build命令脚本进行编译。编译后的项目结果如图所示。
Android NDK的构建系统是基于GUN Make的。该构建系统的主要目的是使开发人员能够用很短的构建文档来描述原生的Android应用程序。
上述Android NDK的开发流程中通过配置Android.mk来编译是其中的一种方式,还有两种方式。
这种方式简化了编写Android.mk文件,跟上述流程一样,只是不需要编写Android.mk和Application.mk,但是需要添加两样配置。
在主Module的build.gradle的defaultConfig里添加
ndk{ moduleName 'hello' abiFilter 'armeabi-v7a' }
注意:这种方式无法再Android Studio3.0以上使用,只能在3.0以下使用,3.0及以上采用cmake来编译生成so文件。
在Android Studio2.2及以上版本中,可以使用cmake插件来编译c库,这也是最新的ndk开发方式。首先你需要在SDK Tools中下载CMake和LLDB这两个组件,当然ndk也是必须的。
当你安装好上述两个组件后,你可以使用Android Studio创建支持C/C++的新项目。步骤如下:
在向导的 Customize C++ Support 部分,您可以使用下列选项自定义项目:
-fexceptions
标志添加到模块级 build.gradle
文件的 cppFlags
中,Gradle 会将其传递到 CMake。-frtti
标志添加到模块级 build.gradle
文件的 cppFlags
中,Gradle 会将其传递到 CMake。点击 Finish,创建成功,项目结构如下图所示。
当你创建完成项目后点击Android Studio中Build->Make Project,系统会帮你构建完成后,你就可以在相对应Module下的build->intermediates->cmake下找到so库。