本文目录

  一、androidstudio环境

  二、快捷键配置

  三、新建项目

  四、NDK开发

  五、so文件编译

一、 androidstudio的环境

在SDK Tools中安装NDK开发环境(File > Settings > Appearance & Behavior > System Settings > Android SDK > SDK Tools):  NDK

        

二、快捷键的配置

打开File > Settings > Tools > External Tools选项,点击【+】按钮添加生成jni头文件以及ndk-build命令的快捷工具:

  ①生成头文件  

  Name:javah-jni

    工具名称

  Program:$JDKPath$/bin/javah

    javah所在的路径,$JDKPath$代表在环境变量中配置的JDK路径。

  Parameters:-jni -encoding UTF-8 -d $ModuleFileDir$\src\main\jni $FileClass$

    命令参数:

    -jni代表生成JNI样式的标头文件,文件名为当前包名+类名($FileClass$)

    •-encoding代表编码格式为UTF-8

    •-d代表指定头文件的输出路径为jni目录($ModuleFileDir$\src\main\jni )

  Working directory:$ModuleFileDir$\src\main\java

    工作目录,$ModuleFileDir$为当前module的路径。

  ②NDK构建

  ndk-build的配置和javah-jni类似,其中C:\Tools\NDK\android-ndk-r14b\ndk-build.cmd为ndk-build构建工具的路径,需要按照实际NDK安装路径进行修改。

③如何调用

右击项目选择External Tools:

三、新建一个普通的项目   

 ①在main目录下新建jni目录,在此目录下编写原生代码:
   ②在main目录下新建jniLibs目录,此目录为Android Stuido加载so文件的默认目录,看下项目结构

          

四、NDK开发

①MainActivity

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 = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
} /**
* native-lib中的原生方法
*/
public native String stringFromJNI();
}

②对着MainActivity的类名右击鼠标,选择External Tools > javah-jni,控制台执行完命令后,会在jni目录生成一个头文件:
 ③jni目录中新建cpp类native-lib.cpp,引用上文中生成的头文件,返回一个字符串给Java层,
 ④接着在jni目录下创建Android.mk和Application.mk配置文件

Android.mk

# 当前路径
LOCAL_PATH := $(call my-dir) # 清除LOCAL_XXX变量
include $(CLEAR_VARS) # 原生库名称
LOCAL_MODULE := native-lib # 原生代码文件
LOCAL_SRC_FILES =: native-lib.cpp # 编译动态库
include $(BUILD_SHARED_LIBRARY)

Application.mk

# 原生库名称
APP_MODULES := native-lib # 指定机器指令集
APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64 mips mips64

⑤在app的build.gradle文件中关联Android.mk(相当于执行了【Link C++ Project with Gradle】)

android {
... externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}

五、so文件编译

①对着jni目录右击鼠标,选择External Tools > ndk-build,会在main目录下生成libs和obj目录,编译出的so文件就在libs目录下

②将so文件拷贝到jniLibs目录下就可以正常使用了,也可以在app的build.gradle文件中设置so文件的路径。

注意:编译出的so文件就相当于java中的jar包,上文中的jni就相当于library,两者不要重复使用。

原文链接:https://blog.csdn.net/kong_gu_you_lan/article/details/79146817

Android NDK(一) ndk-build构建工具进行NDK开发的更多相关文章

  1. Android NDK开发 Android Studio使用新的Gradle构建工具配置NDK环境(一)

    本文主要讲述了如何如何在Android Studio使用新的Gradle构建工具配置NDK环境,现在把相关的步骤整理出来分享给Android程序员兄弟们,希望给他们在配置NDK环境时带来帮助. 从An ...

  2. Android NDK(二) CMake构建工具进行NDK开发

    本文目录 一Androidstudio中需要的插件 二项目配置 ①build.gardle配置 ②CMakeLists.txt ③Android和Cpp的代码 ④so文件生成 ⑤so文件的位置 一.A ...

  3. [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建

    本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...

  4. Android Gradle 构建工具(Android Gradle Build Tools)是什么?

    转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...

  5. 一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5

    译者地址:[翻]一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5 原文:First Look at New Android Gradle Build To ...

  6. AS Gradle构建工具与Android plugin插件【大全】

    Android plugin version 与 gradle version 的关系 Gradle是一种构建工具,它通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本对 ...

  7. [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

    链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...

  8. Build Tool(构建工具)

    what: 构建工具能够帮助你创建一个可重复的.可靠的.携带的且不需要手动干预的构建.构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求.假设你想要编译源代码,将生成的clas ...

  9. Android构建工具--AAPT2源码解析(一)

    一.什么是AAPT2 在Android开发过程中,我们通过Gradle命令,启动一个构建任务,最终会生成构建产物"APK"文件.常规APK的构建流程如下: (引用自Google官方 ...

随机推荐

  1. 2019杭电多校 hdu6659 Acesrc and Good Numbers

    http://acm.hdu.edu.cn/showproblem.php?pid=6659 题意:给你d,x,让求满足f(d,n)=n的最大n(n<=x),其中f(d,n)表示数字d在从1到n ...

  2. atcoder E - Jigsaw(思维)

    题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_e 题解:这题很巧妙运用了cnt[i]抽象的表示了上下互补的状态,最后上面突出的一定要处理完.下面 ...

  3. Codeforces 734D. Anton and Chess(模拟)

    Anton likes to play chess. Also, he likes to do programming. That is why he decided to write the pro ...

  4. to_char()、to_date()的区别

    to_char 是把日期或数字转换为字符串 to_date 是把字符串转换为数据库中得日期类型 还记得以前初次接触oracle时对一些函数还不是很熟悉,老是弄错,比如在mysql中可以运行,但在ora ...

  5. 第二章(Kotlin基础)

    基本要素:函数和变量 函数 函数定义规则 函数通过关键字 fun 用来声明一个函数 参数的类型与函数返回类型写在它的名称后面,这和变量声明一样 函数可以定义在文件的最外层,不一定要把它放在类中 示例: ...

  6. Vert.x Core 文档手册

    Vert.x Core 文档手册 中英对照表 Client:客户端 Server:服务器 Primitive:基本(描述类型) Writing:编写(有些地方译为开发) Fluent:流式的 Reac ...

  7. PopupWindow弹出框

    使用PopupWindow实现一个悬浮框,悬浮在Activity之上,显示位置可以指定 首先创建pop_window.xml: <?xml version="1.0" enc ...

  8. Linux 笔记 - 第十七章 Linux LVM 逻辑卷管理器

    一.前言 在实际生产中,有时会遇到磁盘分区空间不足的情况,这时候就需要对磁盘进行扩容,普通情况下需要新加一块磁盘,重分区.格式化.数据复制.卸载旧分区.挂载新分区等繁琐的步骤,而且有可能造成数据的丢失 ...

  9. Linux 笔记 - 第六章 Linux 磁盘管理

    博客地址:http://www.moonxy.com 一.前言 1.1 硬盘 硬盘一般分为 IDE 硬盘.SCSI 硬盘和 SATA 硬盘.在 Linux 中,IDE 接口的设备被称为 hd,SCSI ...

  10. charles 自动存储/auto_save

    本文参考:charles 自动存储 自动保存工具 auto_save "自动保存"工具会在你设定的间隔后,自动保存并清除抓取到的内容.假设你设置了3分钟,则每隔三分钟会保存一次, ...