1.工具准备

Android Studio 3.0.1
SDK Tools中安装SDK版本:16.1
安装:LLDB,c/c++调试器
安装:CMake 编译C/C++生成.so的构建工具

2.新建一个Android工程

在Greate Android Project时勾选Include C++ support
在Customize C++ Support时选择默认的Toolchain Default
会自动生成两个文件
cpp/native-lib.cpp cpp目录是放置c/c++代码
CMakeLists.txt:cmake插件的配置文件,用来指导c/c++如何编译成so文件
在eclipse中是用Android.mk来配置的
官方主推:CMake + CMakeLists.txt来构建库
1)定义库的名称,类型及要编译的源代码

add_library( # 编译生成的库的名称,最终会在前面加上lib libnative-lib.sonative-lib# 生成的库的类型,有SHARED,STATIC,MODULESHARED# 要编译的源代码文件多个文件用空格分开src/main/cpp/native-lib.cpp )

2)包含要编译源码的头文件

# 注意这里指定的是头文件的目录
include_directories(src/main/cpp/include/)

3)使用NDK里的api,链接动态预编译好的库

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 )
#链接到native-lib库中
target_link_libraries( # Specifies the target library.native-lib# Links the target library to the log library# included in the NDK.${log-lib} )

3.编译运行项目

在编译运行项目后在project视图下可以看到在build下多了一个android-profile目录
profile-xxxx.json编译的版本信息
运行后在TextView中出现Hello from C++
以上是模板生成的
生成的库文件在
./app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so
./app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
同样的程序代码为了兼容不同的CPU,需要为不同的ABI构建不同的库文件
armeabi设备只兼容armeabi;
armeabi-v7a设备兼容armeabi-v7a、armeabi;
arm64-v8a设备兼容arm64-v8a、armeabi-v7a、armeabi;
X86设备兼容X86、armeabi;
X86_64设备兼容X86_64、X86、armeabi;
mips64设备兼容mips64、mips;
mips只兼容mips;

4.自定义一个java文件生成所需要的接口函数

1)MathTool.java 在java文件中建立native方法和加载库
public class MathTool {static {System.loadLibrary("math-lib");}public static native int add(int i, int j);public static native int sub(int i, int j);}
通过alt+enter键在native-lib.cpp中自动生对应的方法使编译能通过
2)native-lib.cpp
extern "C"
JNIEXPORT jint JNICALL
Java_com_bshui_ndktest_MathTool_add(JNIEnv *env, jclass type, jint i, jint j) {//实现相关的代码return i+j;}extern "C"
JNIEXPORT jint JNICALL
Java_com_bshui_ndktest_MathTool_sub(JNIEnv *env, jclass type, jint i, jint j) {jint ret = 0;ret = i-j;return ret;}3)修改CMakeLIsts.txt
add_library( # Sets the name of the library.math-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).src/main/cpp/native-lib.cpp )
target_link_libraries( # Specifies the target library.math-lib# Links the target library to the log library# included in the NDK.${log-lib} )
4)Android 应用测试引用TextView tv = (TextView) findViewById(R.id.sample_text);int sum,sub;sum = MathTool.add(5,10);sub = MathTool.sub(5,10);tv.setText("sum(5,10)="+sum+" sub(5,10)="+sub);

5.其它项目引用

只需提供.so和.jar

1)在libs目录下新建arm64-v8a把对应的libmath-lib.so导入
2)把classes.jar放入libs目录下
导出class.jar, 原工程New Module-->Android Library
注意包名为com.bshui.ndktest,与生成native的java同包名
编译后生成class.jar包
3)build.gradle app的android中加入
sourceSets {main {jniLibs.srcDir 'libs'}}
4)在工程中调用api
tv = (TextView)findViewById(R.id.tv);
int sum = MathTool.add(10,20);
int sub = MathTool.sub(20,10);
tv.setText("sum(10,20)="+sum+" sub(20,10)="+sub);

AS 配置使用NDK相关推荐

  1. 在eclipse中配置android ndk的自动编译环境builders

    无论linux还是mac在jni目录中直接运行  ndk-build 就可以生成 lib目录及所需要的 so文件: windows 装上lnx模拟器也是一样: 每次修改完 c++代码, 都要运行一下 ...

  2. 01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码),javah命令使用

    1 什么是JNI JNI Java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(C/C++) 通过这个协议,java代码就可以调用外部的C/C++代码,外部的C/C++ ...

  3. Linux下AndroidNDK r7环境配置与NDK入门

    一,下载NDK http://developer.android.com/sdk/ndk/index.html 还是推荐官网下载写这篇文章时最新版本是r7. 二,配置环境 我们真是幸福==因为从r7版 ...

  4. 在eclipse里配置Android ndk环境 适用于windows mac 和linux[转]

    由于做Android在底层有库的时候需要交叉编译环境,c代码需要用ndk-build来进行编译,而java代码则需要用Android sdk编译.之前由于对eclipse ide不太熟悉,所以往往编译 ...

  5. 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

    文章目录 I . 源码编译配置 II . 构建脚本配置 III . NDK 函数库打包配置 IV . Java 与 C 代码示例 V . CMake 配置 ( CMakeLists.txt ) VI ...

  6. 【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 )

    文章目录 I . 创建 NDK 项目 II . NDK 项目 相关配置 III . NDK 中获取 Android 版本号 IV . 使用 __system_property_get 可获取的参数 I ...

  7. OpenCV android sdk配置OpenCV android NDK开发实例

    OpenCV android sdk配置OpenCV android NDK开发实例 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/det ...

  8. android ndk配置环境,在Windows中的安装Android NDK开发环境

    我学习NDK的时候,已经不再需要安装cygwin及gcc,make等编译工具,NDK包已经为你准备好一切 :-) 第一步 下载 NDK 登录 http://developer.android.com/ ...

  9. NDK开发_cwin配置+编程简单步骤

    最近在调试 车辆识别demo,说实话,虽然最初接触jni的时候,是在eclipse工程中进行开发的,不过后面遇到的项目都是直接放到了android 源码中编译的,所以对于在eclipse中的ndk开发 ...

最新文章

  1. MongoDB空间分配
  2. IIS7的HTTP 500.19错误
  3. java修改jpg图片、mp3音频文件的后缀名
  4. Android与Windows Socket通信,TLS双向认证
  5. oracle查看锁表语句、解锁方法
  6. JSP统计网站访问人数
  7. 天津大学计算机学院2019夏令营,天津大学环境学院2019年全国优秀大学生夏令营顺利举行...
  8. 电影《战狼》评论词云分析
  9. 走近Palantir
  10. Git Commit Message校验踩坑指南
  11. 区块链大咖专访丨摩联科技:走一条少有人走的路
  12. 联想拯救者y7000电脑开机一直是锁屏界面,点一下就黑屏,无法进入输密码界面
  13. java生成随机的26位英文字母
  14. 解决电脑“自动修复 电脑未正确启动/无法修复你的电脑”
  15. Jess的一些使用示例
  16. Git从入门到熟练第八讲 创建和使用分支
  17. 如何理解机器学习和统计中的AUC?
  18. 字母上面一横 怎么输入
  19. 通过sql语句查询oracle版本信息
  20. PYTHON实现AES加密,中英文通用!!!

热门文章

  1. Springboot+Netty实现基于天翼物联网平台CTWing(AIOT)终端TCP协议(透传模式)-应用订阅端(北向应用)
  2. 中毒后的反思,我再也受不了
  3. W5500全硬件 TCP/IP 嵌入式以太网控制器WIZNET
  4. 什么是 BA ?BA怎么样?BA和BI是什么关系?
  5. 【315全民季】Adobe权威国际认证体系,Adobe国际认证!
  6. ETF期权显著提高标的证券定价效率
  7. 谷歌浏览器无法访问摄像头的解决方案
  8. AGV小车经典算法设计及应用
  9. 软件磁盘阵列 (Software RAID)
  10. QNX Neutrino 进程间通信编程之Message-passing/Pulse