Android NDK(二) CMake构建工具进行NDK开发
本文目录
一Androidstudio中需要的插件
二项目配置
①build.gardle配置
②CMakeLists.txt
③Android和Cpp的代码
④so文件生成
⑤so文件的位置
一、Android studio中需要的插件:
CMake
LLDB
NDK
二、项目配置
①build.gardle的配置
多了两个externalNativeBuild :defaultConfig下的、和defaultConfig 并行下的externalNativeBuild
a、defaultConfig下的externalNativeBuild
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags ""
//cppFlags "-fexceptions -frtti" ,在AndroidStudio新建项目->选择C++版本时,勾选•Exceptions Support和•Runtime Type Information Support时会有,
}
}
}
注:
Exceptions Support:支持C++异常处理
Runtime Type Information Support:支持运行时类型识别, 程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型
b、和defaultConfig 并行下的externalNativeBuild ,用于指定CMakeLists.txt的路径
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
②CMake的构建脚本
# 设置Cmake最小版本
cmake_minimum_required(VERSION 3.4.1) # 编译library
add_library( # 设置library名称
native-lib # 设置library模式,SHARED模式会编译so文件,STATIC模式不会编译
SHARED # 设置原生代码路径
src/main/cpp/native-lib.cpp ) # 定位library
find_library( # library名称
log-lib # 将library路径存储为一个变量,可以在其他地方用这个变量引用NDK库
# 在这里设置变量名称
log )
# 关联library
target_link_libraries( # 关联的library
native-lib # 关联native-lib和log-lib
${log-lib} )
③Cpp代码和Android代码调用
Cpp代码:
#include <jni.h>
#include <string> extern "C"
JNIEXPORT jstring JNICALL
Java_com_yl_ndkdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
Android代码:
public class MainActivity extends AppCompatActivity {
// 加载native-lib,不加lib前缀
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 将获取的字符串显示在TextView上
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
/**
* native-lib中的原生方法
*/
public native String stringFromJNI();
}
④so文件的生成
在CMakeLists.txt中将library的编译模式设置为SHARED模式,点击AS的编译按钮,在app > build > intermediates > cmake > debug > obj目录下会生成不同CPU架构对应的so文件
不同架构的指定:
defaultConfig {
...
ndk {
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64", "mips", "mips64"
}
}
⑤so文件的位置
在项目的app > src > main目录下创建jniLibs文件夹,将生成的so文件(带着CPU架构目录)拷贝到jniLibs文件夹中
参考:https://blog.csdn.net/kong_gu_you_lan/article/details/79091789
Android NDK(二) CMake构建工具进行NDK开发的更多相关文章
- Android NDK(一) ndk-build构建工具进行NDK开发
本文目录 一.androidstudio环境 二.快捷键配置 三.新建项目 四.NDK开发 五.so文件编译 一. androidstudio的环境 在SDK Tools中安装NDK开发环境(File ...
- Android NDK开发 Android Studio使用新的Gradle构建工具配置NDK环境(一)
本文主要讲述了如何如何在Android Studio使用新的Gradle构建工具配置NDK环境,现在把相关的步骤整理出来分享给Android程序员兄弟们,希望给他们在配置NDK环境时带来帮助. 从An ...
- JS模块化开发(二)——构建工具grunt
gruntJs——构建工具:代码压缩.文件合并 安装流程: 1.到nodeJs官网下载安装nodeJs(附带了npm包管理工具) 2.cmd命令行:npm install -g grunt-cli / ...
- Erlang:[笔记二,构建工具rebar之发布应用]
概述 通过rebar可以发布rebar构建的erlang项目,生成可执行的二进制脚本文件,大大降低了执行应用的复杂度.该笔记Erlang环境为Erlang/OTP 19 ,以下适用于Eralng/OT ...
- Android hybrid App项目构建和部分基本开发问题
1.首先是选型:Cordova+Ionic Framework,调试测试环境是Ripple Emulator.开发环境其实可以随便选,我个人选择了Eclipse,当然Android SDK+ADT也是 ...
- Android构建工具--AAPT2源码解析(一)
一.什么是AAPT2 在Android开发过程中,我们通过Gradle命令,启动一个构建任务,最终会生成构建产物"APK"文件.常规APK的构建流程如下: (引用自Google官方 ...
- 构建工具Gradle
1.Summary 从Android团队开始宣布放弃Eclipse转投Android Studio时,构建工具Gradle进入了Android开发者的视野.而随着热修复.插件化.编译时注解的流行, ...
- android studio使用CMake和NDK,实现应用自身被卸载时打开某一网址
实现应用自身被卸载时打开某一网址的c代码 MyActivity: public class MyActivity extends Activity { /** * Called when the ac ...
- Android NDK 简单介绍、工具安装、环境配置
NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一 ...
随机推荐
- 在Linux中增加swap空间
转自: http://blog.csdn.net/chinalinuxzend/article/details/1759593 在Linux中增加swap空间 在安装Linux的时候,不知道swap空 ...
- js生成玫瑰图
html: <canvas id="c" height="600" width="600"></canvas> js ...
- Flask大型项目框架结构理解
导语:前段时间学习狗书的flask大型项目框架结构的时候有点混乱,到现在也知道是个啥了,想着,把关系理一理,写一篇博客.也方便后来学习的人查阅.以下是我创建项目时候的结构. myproject --- ...
- MAMP 访问时显示文件列表
原文链接:他叫自己MR张 背景 MAMP是Mac下的一个PHP+Nginx+MySQL的集成环境,支持多站点,不同版本PHP. 今天有人请教MAMP如何显示文件列表的问题,这里记录一下. 知识补充 一 ...
- C#开发BIMFACE系列27 服务端API之获取模型数据12:获取构件分类树
系列目录 [已更新最新开发文章,点击查看详细] BIMFACE官方示例中,加载三维模型后,模型浏览器中左上角默认提供了“目录树”的功能,清晰地展示了模型的完整构成及上下级关系. 本篇介绍如何获 ...
- 1044/1045 - Access denied for user 'username'@'yourhost'
度娘很久都未能解决,大多都是修改配置文件,或是执行如下SQL: update user set Password=password('111111') where `user`='root'; 我本地 ...
- 012 模块1-turtle库的使用
目录 一.概述 二.turtle库基本介绍 2.1 turtle库概述 2.2 标准库 2.3 turtle的原(wan)理(fa) 2.4 turtle的魅力 三.turtle绘图窗体布局 3.1 ...
- Mybatis使用入门,这一篇就够了
mybatis中,封装了一个sqlsession 对象(里面封装有connection对象),由此对象来对数据库进行CRUD操作. 运行流程 mybatis有一个配置的xml,用于配置数据源.映射Ma ...
- 装逼手册之 python中的内存分配的小秘密
装逼手册之 python中的内存分配的小秘密 虽然我们现在得益于时代和技术的发展,不用再担心内存的问题:但是遥想当年,都是恨不得一个钢镚掰成俩份用,所以我就想深入了解一下,在python中内存分配的一 ...
- SpringCloud(四)Hystrix熔断器
前面已经学习了服务注册与发现组件,负载均衡组件,这样我们的微服务系统已经可以使用了.为了保证其高可用,单个服务通常会集群部署.由于网络原因或者自身的原因,服务并不能保证 100% 可用,如果单个服务出 ...