详解AndroidStudio3.0开发调试安卓NDK的C++代码
作者:asmcvc 发布时间:2022-09-29 07:02:53
本文介绍了AndroidStudio3.0开发调试安卓NDK的C++代码,分享给大家,具有如下:
一、新建项目
新建项目,没有发现Include C++ Support 选项。因为印象中是有过该选项的,找了半天没找到。
后来无意间拖了下窗口大小,原来是被隐藏了,真特么坑。
新建一个测试项目,勾选Include C++ Support 选项,看看工程上有哪些不同。
1、gradle
首先看gradle文件,android节点下添加:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
defaultConfig节点下添加:
externalNativeBuild {
cmake {
cppFlags "-std=c++14"
}
}
2、CPP
与Java节点同级多了一个cpp的节点,对应目录为src\main\cpp,与src\main\java同级,默认只有一个native-lib.cpp文件,没有.mk文件及其他,比较简单:
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_bigsing_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
3、CMakeLists.txt
在app目录下多了一个CMakeLists.txt文件。
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
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).
src/main/cpp/native-lib.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
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 )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
其中native-lib为最终生成的SO的名称(libnative-lib.so),默认CPU为armeabi-v7a
默认的工程属性不用配置,debugger默认为auto会自动适配,直接在cpp里下断点,调试方式运行App,会自动断下,变量数值均能在调试状态下看到。
试用了下AndroidStudio对NDK的调试支持的还不错,于是打算把过去的项目也支持起来,方法请看下节。
二、已有项目
1、安装C++调试器LLDB
由于之前一直没有使用过AndroidStudio调试过native的代码,网上了解到AndroidStudio调试NDK是需要一个LLDB的插件,默认是没有的,所以先手动安装一下。
这里有个另类的方法:“Edit Configurations”打开程序配置,在debugger里选择Native(默认为auto),然后运行App,因为工程之前一直是只有Java代码的,所以这里选择了Native,AndroidStudio会提示并没有安装C++的调试器,根据提示安装即可。
可以看出,安装的调试器是LLDB。
2、Link C++ Project with Gradle
在老项目里面添加NDK的支持,可以右键项目选择菜单:Link C++ Project with Gradle
编译方式有两种:CMake和ndk-build,其中ndk-build是传统方式,AndroidStudio默认推荐CMake方式,也许这是以后的主流方式,所以我们选择默认的CMake.
然后是指定CMakeLists.txt文件的路径,这里可以复制新建项目的CMakeLists.txt文件到现有项目的app目录下,把它放到和proguard-rules.pro相同的文件夹下即可。然后把这个CMakeLists.txt文件的全路径输入进去,点OK。
这个时候会发现gradle文件自动添加了:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
但是并未指定C++的版本,可以参考新建项目的内容手动添加:
externalNativeBuild {
cmake {
cppFlags "-std=c++14"
}
}
3、整理C++源码的文件组织形式
新建一个cpp目录:src\main\cpp,与src\main\java同级,把C++源码文件移动至此目录下,并有序组织好。
4、修改CMakeLists.txt
由于是复制的demo工程的CMakeLists.txt文件,比较简单,不能够满足现有工程,需要修改一下。这里说一下常用的几个功能:
- 设置其他后缀文件(例如.S汇编文件)为可编译源文件:
set_property(SOURCE src/main/cpp/art/art_quick_dexposed_invoke_handler.S PROPERTY LANGUAGE C)
设置多个不定数量的源文件(也即使用*星号通配符的方式):
file(GLOB native_srcs "src/main/cpp/*.cpp" "src/main/cpp/dalvik/*.cpp" "src/main/cpp/art/*.cpp" "src/main/cpp/art/*.S")
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).
${native_srcs}
)
链接三方SO库文件(例如我需要使用三方的libsubstrate.so库做测试):
file(GLOB libs src/main/cpp/3rd/libsubstrate.so src/main/cpp/3rd/libsubstrate-dvm.so)
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${libs}
${log-lib} )
5、恢复debugger为默认的auto
“Edit Configurations”打开程序配置,在debugger里选择auto,因为之前修改为了Native。这样,无论是Java代码还是C++代码均可以调试了。
三、总结
能支持对C++代码的动态调试,无疑是非常强大的功能,关键现在AndroidStudio对C++代码在编辑器也支持的很好,所以总体是建议迁移过来的。
不足就是编译速度太慢了,VisualStudio编译下来秒间就能完成了,AndroidStudio下要十几秒甚至更长。在调试的时候启动LLDB也很慢,有时一直卡在Starting LLDB server
建议VS和本方法结合使用,需要调试的时候就用AndroidStudio调试,如果仅仅是编译C++代码则可以使用VS,VS的方法参见:使用VisualStudio高效开发调试AndroidNDK
来源:http://blog.csdn.net/asmcvc/article/details/78690371


猜你喜欢
- 学习内容Java I/O 项目案例内容管理java文件I/O实例----生成报表我们之前学习了两个重要的模块,一个就是Java I/O 另外
- SpringBoot集成Mybatis+xml格式的sql配置文件最近一直在研究SpringBoot技术,由于项目需要,必须使用Mybati
- 打开ITerm终端进入命令输入,sudo su,输入密码创建.bash_profile文件touch .bash_profile打开.bas
- 项目初始流程:首先说一下pom.xml文件的依赖: <dependencies><!-- junit 测试 -->
- 大家都知道NPOI组件可以在你本地没有安装office的情况下来 读取,创建excel文件。但是大家一般都是只默认读取一个excel文件的第
- 前言TensorFlow是Google开源的一款人工智能学习系统。为什么叫这个名字呢?Tensor的意思是张量,代表N维数组;Flow的意思
- Json格式是常见的读写形式。读写Json文件也是常用的操作。这次来实践一下Json文件的读写。首先在SD卡上的读写权限是一定要申请的。那么
- Spring的注解@Qualifier小结近期在捯饬spring的注解,现将遇到的问题记录下来,以供遇到同样问题的童鞋解决~先说明下场景,代
- 系列文章已完成,目录如下:commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理slf
- 单例模式动机有时候只有一个类的实例是很重要的。比如,一个系统应该只有一个窗口管理实例。单例模式是最简单设计模式:类负责实例化自己,确保只有一
- 最近有个项目的几张表,数量级在千万以上,技术栈是SpringBoot+Mybatis-plus+MySQL。如果使用单表,在进行查询操作,非
- 一、前言最近接到一个任务,需要爬取五级行政区划的所有数据(大概71万条数据在),需要爬取的网站:行政区划 - 行政区划代码查询 发
- Java调用Linux系统命令有时候,我们在使用Java做一些操作时,可能性能上并不能达到我们满意的效果,就拿最近工作中的遇到的一个场景来说
- 服务端package lesson02;import java.io.*;import java.net.ServerSocket;impo
- 本文实例讲述了C#生成随机数的方法。分享给大家供大家参考。具体如下:/// <summary> /// 生成num位
- 一、什么是相对布局相对布局是另外一种控件摆放的方式相对布局是通过指定当前控件与兄弟控件或者父控件之间的相对位置,从而达到相对的位置二、为什么
- 1、在Anaylze中选择Run Inspection by Name...2、在点击之后弹出的窗口输入unusedresources后,回
- 微信的图片下拽返回功能在日常使用中非常方便,同时在很多 App 中都见到了类似的设计,可以说一旦习惯这种操作再也回不去了。这几天逛 GitH
- 一、文件对话框C#中共有三种文件对话框,分别用于不同的功能:(1)用于打开文件的对话框OpenFileDialog。(2)用于保存文件的对话
- 面试题1:你了解线程池么?简单介绍一下。java提供的一个java.util.concurrent.Executor接口的实现用于创建线程池