NDK开发入门

来源:互联网 发布:数据库视频教程哪个好 编辑:程序博客网 时间:2024/05/23 20:26

安卓开发之NDK入门

环境配置

WINDOWS的配置方式

1 下载Android Studio

官方下载地址;国内的一个不错的开发者网站

现在最新的正式版本为2.2.3,创建项目时包含C/C++支持就可以有历程,很nice。

2 SDK和NDK下载

安装过程就会进行相关内容的下载,当然NDK的话需要去手动下载一下

如果不能下载或者网速不好,想要用下载器,也可以直接去上面那个开发者网站下载,原则上可以直接下载

3 配置NDK

如果使用Android Studio下载的,那么进入项目,选择项目结构Project Structure,在SDK Location菜单可以看到Android NDK location已经有了目录,复制这个目录;对于另外下载的情况,则根据你解压NDK包的位置来填写这个目录,同时复制目录。

接下来就是设置环境变量,使用以上复制的目录完成设置。首先是本电脑属性,选择高级系统设置。

接下来选择高级菜单中的环境变量。

最后在系统变量的Path中新建项,添加我们的NDK目录,即刚才复制的目录。没有Path的话可以新建这个项目。

最后测试一下,使用CMD命令行输入命令ndk-build命令,出现类似的信息说明已经完成配置。

Mac和Linux的配置方式

第一步和第二步的操作同Windows下,第三步的操作配置环境变量,在Mac和Linux下使用命令完成。

Mac下配置
#首先新建.bash_profilevim ~/.bash_profile#接着输入环境变量,类似在Windows下的操作,复制目录然后添加到环境变量export NDK_ROOT=这里输入刚才复制的目录#保存并关闭,然后输入以下命令进行更新source .bash_profile#最后使用一下命令测试,出现类似以上Windows下出现的消息即可ndk-build
Linux下配置
#首先打开环境变量配置文件sudo vim /etc/profile#接着添加NDK环境变量export PATH=这里输入NDK目录:$PATH#然后更新环境变量source /etc/profile#最后进行测试,同样使用ndk-build命令

NDK在AS上的使用

新项目

和往常新建项目类似,但是在需要使用C/C++的项目,我们需要勾选Include C++ Support这个选项

最后会有C++相关的选项,根据个人需要选择,这里直接默认。

官方解释如下:

C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

项目编译完成之后,我们可以看到主界面与往常相比多了一个cpp文件夹和一个External Build Files项。cpp文件夹下面是C++相关的内容,本示例代码提供了一个简单的 C++ 函数 stringFromJNI(),此函数可以返回字符串“Hello from C++”。。External Build Files下是CMakeLists.txt文件,用于C++项目构建。

运行的整个流程如下:

  1. Gradle 调用您的外部构建脚本 CMakeLists.txt。
  2. CMake 按照构建脚本中的命令将 C++ 源文件 native-lib.cpp 编译到共享的对象库中,并命名为 libnative-lib.so,Gradle 随后会将其封装到 APK 中。
  3. 运行时,应用的 MainActivity 会使用 System.loadLibrary() 加载原生库。现在,应用可以使用库的原生函数 stringFromJNI()。
  4. MainActivity.onCreate() 调用 stringFromJNI(),这将返回“Hello from C++”并使用这些文字更新 TextView。

关于CMakeLists的一些解释

这里我们在该文件下添加内容来编译我们的cpp项目,可以参照项目的格式进行添加模块。需要添加新的库,那么主要就是要加入一个新的add_library()项。

# 首先是设置CMake的最低版本,这里采用默认cmake_minimum_required(VERSION 3.4.1)# 接着添加库,首先是库名称,接着设置是否为分享库,最后设置源文件目录add_library( # Sets the name of the library.             native-lib             # Sets the library as a shared library.             SHARED             # Provides a relative path to your source file(s).             # Associated headers in the same location as their source             # file are automatically included.             src/main/cpp/native-lib.cpp )# 将 find_library() 命令添加到您的 CMake 构建脚本中以定位 NDK 库,并将其路径存储为一个变量。您可# 以使用此变量在构建脚本的其他部分引用 NDK 库。以下示例可以定位 Android 特定的日志支持库并将其路径# 存储在 log-lib 中find_library( # Sets the name of the path variable.              log-lib              # Specifies the name of the NDK library that              # you want CMake to locate.              log )# 为了确保您的原生库可以在 log 库中调用函数,您需要使用 CMake 构建脚本中的 # target_link_libraries() 命令关联库:target_link_libraries( # Specifies the target library.                       native-lib                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} )

生成so文件

直接运行并不会生成so文件,so直接整合到apk中了,我们可以使用Build菜单中Analyze APK功能来查看APK包中的内容,可以在lib看到so文件,对应不同的平台。

那么如果我们需要生成so文件怎么办呢,其实配置好NDK之后,非常容易实现,只需要一行代码就行。进入到终端Terminal下,进入项目的app文件夹,然后输入ndk-build命令即可。不过这个时候我们需要Android.mk文件而不是CMakeLists.txt。

首先在cpp文件夹下新建Android.mk文件,输入以下内容:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := native-lib  #这里输入模块名称LOCAL_SRC_FILES := native-lib.cpp   #这里输入你的源文件名include $(BUILD_SHARED_LIBRARY)    #这里将包含文件夹下的头文件

接着我们需要在Gradle中修改编译的方式,使用Android.mk来编译:

//    externalNativeBuild{//        cmake{//            path file("CMakeLists.txt")//        }//    }    externalNativeBuild{        ndkBuild{            path file("src/main/cpp/Android.mk")        }    }

编译通过之后,可以在命令行输入以下命令来生成库文件:

#NDK_PROJECT_PATH是cpp项目路径,APP_BUILD_SCRIPT是脚本Android.mk的位置ndk-build NDK_PROJECT_PATH=./cpp APP_BUILD_SCRIPT=./src/main/cpp/Android.mk

成功的情况可以看到如下的提示,生成了不同平台的so文件。

生成的so文件可以给其他人使用。

本次关于NDK的入门到此结束,更深的学习还需要学习。

0 0