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应用一 ...
随机推荐
- SDU暑期集训排位(2)
A. Art solved by sdcgvhgj 3min 签到 B. Biology solved by sdcgvhgj 85min 暴力 C - Computer Science solved ...
- D-query
SPOJ - DQUERY 题意 求区间内出现一共有几种数字. 上次写了一个主席树,这次用一下莫队,莫队是离线询问的一种操作,将询问分块,如果在同一个块内就按照右端点排序,如果不在同一个块内就按照块的 ...
- HDU - 3966 树链刨分
题目传送门 操作就是询问某个点的值, 然后就是对一条路径上的值全部修改. 最基本的树刨题目了. 树刨的思想: 1. 对于每个点找到他的重儿子. void dfs1(int o, int u){ sz[ ...
- hdu 3065病毒侵袭持续中(ac自动机)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3065 中文题题意不解释了. 依旧稍微改一下ac自动机模版就能过了.还有一个坑点!是多组数据!!! #i ...
- C#基础——事件初步
事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件.在这里将以较简单的方式呈现事件最基本的用法. 1.事件的定义 给事件下定义是一个较困难的事,因为它体现的是对象与对 ...
- 史上最全面的SignalR系列教程-目录汇总
1.引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习. 致正在奔跑的您! 2.SignalR介绍 SignalR实现服务器与客户端的实时通信 ,她是一个 ...
- LocalBroadcastManager 的简单介绍
Android应用开发之(小技巧之LocalBroadcastManager) Android v4 兼容包提供android.support.v4.content.LocalBroadcastMan ...
- CTF常用软件/工具
慢慢更新 整合版: http://www.jz5u.com/Soft/Progra/tool/163275.html/ 各种在线工具以及工具整合 http://www.ctftools.com/ 逆向 ...
- Moonraker 靶机渗透
0x01 简介 攻击Moonraker系统并且找出存在最大的威胁漏洞,通过最大威胁漏洞攻击目标靶机系统并进行提权获取系统中root目录下的flag信息. Moonraker: 1镜像下载地址: htt ...
- 用Python怎么SSH到网络设备
0. 前言 自上一篇文章<用python怎么telnet到网络设备>,简单使用了telnetlib库给大家演示了下,但是,现实环境中仍不建议去使用telnet. SSH(Secure Sh ...