本文目录

  一、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. ZOJ - 3870-Team Formation二进制,位运算

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3870 题意:找出一个数列中的两个数,所有通过异或和使得结果同时大于 ...

  2. 牛客练习赛17 B-好位置

    传送门 题意:本来惯例中文题不解释的, 但是有些人不懂这个题意, 简单的来说, 就是s1每一个的每一个字符都可以和别的字符构成一个子串 == s2.  算了还是惯例中文题意不解释吧. 题解:其实以前写 ...

  3. “玲珑杯”ACM比赛 Round #18 C -- 图论你先敲完模板(和题目一点关系都没有,dp)

    题目链接:http://www.ifrog.cc/acm/problem/1146?contest=1020&no=2 题解:显然知道这是一道dp而且 dp[i]=min(dp[j]+2^(x ...

  4. codeforces 799 D. Field expansion(dfs+思维剪枝)

    题目链接:http://codeforces.com/contest/799/problem/D 题意:给出h*w的矩阵,要求经过操作使得h*w的矩阵能够放下a*b的矩阵,操作为:将长或者宽*z[i] ...

  5. CF 990D Graph And Its Complement 第十八 构造、思维

    Graph And Its Complement time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  6. 关于Ubunto在VMwark中无法全屏。

    1.右键点击Ubunto桌面,进入终端 输入: 1.sudo apt-get install open-vm*   安装依赖项 2.sudo apt-get install open-vm-tools ...

  7. 【Redis】基本数据类型

    一.概述 二.String(字符串) 三.List(列表) 四.Hash(字典) 五.Set(集合) 六.Sorted Set(有序集合) 一.概述 Redis目前支持5种数据类型,分别是: Stri ...

  8. js操作cookie(创建、读取、删除)方法总结

    js操作cookie,可以通过开源的插件实现,方便快捷,兼容性好,同样也可以自己写: 此文主要介绍两个常用的插件: Js.cookie.js 和 jQuery.cookie.js 0.Js.cooki ...

  9. 4、链栈的实现(java代码)

    1.链节点 public class Node<T> { public T data; public Node next; } 2.实现代码 public class Stack<T ...

  10. TestNG(七)组测试

    package com.course.testng.groups; import org.testng.annotations.AfterGroups; import org.testng.annot ...