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++项目构建。
运行的整个流程如下:
- Gradle 调用您的外部构建脚本 CMakeLists.txt。
- CMake 按照构建脚本中的命令将 C++ 源文件 native-lib.cpp 编译到共享的对象库中,并命名为 libnative-lib.so,Gradle 随后会将其封装到 APK 中。
- 运行时,应用的 MainActivity 会使用 System.loadLibrary() 加载原生库。现在,应用可以使用库的原生函数 stringFromJNI()。
- 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的入门到此结束,更深的学习还需要学习。
- NDK入门:老码农谈NDK开发
- Android ndk开发入门
- Android NDK开发入门
- NDK开发入门1
- NDK开发入门2
- NDK入门开发3
- NDK开发入门4
- Android -- NDK开发入门
- Android NDK开发入门
- Android NDK开发入门
- Android NDK开发入门
- Android NDK开发入门
- NDK开发入门篇
- NDK 开发入门
- NDK开发入门
- 安卓下NDK开发入门
- Android NDK开发入门
- NDK开发入门
- c语言------指针简介
- 查看CentOS系统版本是32位的还是64位的
- 《黄自元间架结构九十二法》 详解
- ServleConfig和ServletContext
- Errors running builder 'Android Package Builder' on project 解决办法
- NDK开发入门
- 计算年龄(递归)
- Find the Difference(类似 Single Number)
- bootstrap 表单验证
- LeetCode- 289. Game of Life - 思路详解-C++
- 【AHK】AutoHotkey快速入门相关1(2017.01.11)
- Android Handler学习总结
- CFBundleName系列参数的含义
- 解决链接错误:error LNK2001: 无法解析的外部符号 __iob