Android NDK是一系列工具的集合。帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so动态链接库文件

JNI编译环境配置

有2种方式来实现编译jni工程:
方法一:
在ADT的菜单windows->preferences->Android->NDK设置NDK的路径,同时在工程的属性中,选择默认ndk编译。

方法二:
在ADT的菜单windows,属性,build中设置NDK的路径。同时在系统环境变量中配置NDK_ROOT以及路径,然后在工程的属性中,不选择默认NDK,输入编译指令

这里按第一种方式来配置JNI的编译环境:
先下载NDK,然后解压。下载链接:
http://pan.baidu.com/s/1o6OnOp0

设置过程如下图所示:

配置NDK的路径为解压路径即可

示例工程建立

创建JNI的接口类

接口类的位置在src目录下的任意一个包中

package com.example.testndk01;public class JniClient {static public native String getName();}

编译接口类

进入项目文件夹, 生成JNI的头文件, 使用如下的编译命令:

javah -classpath bin/classes -d jni com.example.testndk01.JniClient
也可以直接到工程的classes目录下使用 javah -d jni com.example.testndk01.JniClient 编译

编译完成之后会生成一个com_example_testndk01_JniClient.h头文件,该头文件是根据JniClient.java文件生成的,该文件中含有native方法。

配置Android项目的NativeSupport

右键工程->Android Tools,点击Add NativeSupport,输入一个文件名,之后会生成jni文件夹和两个新的文件。这里生成的是TestNDK01.cpp文件和Android.mk,TestNDK01.cpp文件是和com_example_testndk01_JniClient.h头文件对应的一个C++实现。Android.mk文件是一个Makefile文件,IDE自动生成的,可以不用修改。

添加Native方法的C++实现

直接返回一个字符串

#include <jni.h>#include <com_example_testndk01_JniClient.h>JNIEXPORT jstring JNICALL Java_com_example_testndk01_JniClient_getName(JNIEnv *env, jclass) {return env->NewStringUTF("just a NDK test");}

添加实现方法的时候.h文件或者.cpp文件可能会出现“Unresolved inclusion jni.h”问题,解决办法参考:

使用编译生成的.so动态链接库文件

在自己的Android应用中加载编译的动态链接库文件,注意不许要添加lib前缀和.so后缀

static {System.loadLibrary("TestNDK01");}

加载了库文件之后就可以使用C++提供的方法了,这里示例代码的是一个返回字符串函数,如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv_name = (TextView) findViewById(R.id.tv_name);tv_name.setText(JniClient.getName());}

在onCreate方法中,将JniClient中的getName() (该方法的实际实现就是使用底层C++代码实现的)返回的字符串设置到一个textView控件中。

执行结果:

示例工程文件结构如下:

参考:

http://blog.csdn.net/wangjianzhongfj/article/details/39139497
http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html

【Android】Android中使用JNI调用底层C++代码相关推荐

  1. 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...

  2. android studio 反编译修改versioncode,在android studio 中修改versioncode 跟versionname(示例代码)...

    在android studio 中修改versioncode 和versionname 最写了一个新版的软件准备发布到应用平台上,但是versioncode  和versionname的值一直修改不成 ...

  3. java 调用c++ jni_Java中使用JNI调用C++

    1,JNI是什么? JNI即Java Native Interface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库),或者C/C++调用Java代码 2,主要实现 ...

  4. cocos2d-js 3.0 jsb环境调用底层java代码

    from: http://www.cocoachina.com/bbs/read.php?tid=209403 C++端工作 环境还是cocos2d-js 3.0 beta,准备给javascript ...

  5. jsb调用java_cocos2d-js 3.0 jsb环境调用底层java代码

    C++端工作 环境还是cocos2d-js 3.0 beta,准备给javascript加一个osInfo的函数,来判断用户的系统信息以及网络信息. 首先在项目目录下的frameworks/runti ...

  6. android jni传入接口,在Android studio中编写jni ndk接口并打jar包

    开发环境:Android Studio 3.0 1.新建一个Android Library工程 2.添加一个FingerprintJniLib类 3.编写FingerprintJniLib nativ ...

  7. android开发接口调用,Android开发中webService接口调用示例

    代码示例: package com.study.ws; import java.io.IOException; import org.ksoap2.SoapEnvelope; import org.k ...

  8. 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~

    写在前面 讲道理,这次是真的笔者很久都没有更新 blog 了,主要最近维护的框架问题也是层出不穷,而且对技术交流群的解答也让我身心疲惫,所以在这里跟关注我的人说声抱歉,没有定期给你们带来福利,那么这里 ...

  9. Java中使用JNI调用本地动态库的方法

    在Java中,要使用动态库,就要使用到 JNI.首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java ...

最新文章

  1. 公众号24小时自动吸粉秘密!一次推广终身有客户
  2. Python 常用排序Demo|冒、插、快、希等入门算法
  3. 为什么Nginx性能比Apache高
  4. Qt 给控件QLineEdit添加clicked事件方法
  5. 接收字节流_Java中的IO流之输入流|乐字节
  6. CUTE FTP 控制连接已关闭
  7. 手机号码归属地 mysql_最新手机号段归属地数据库 (2021年1月版) 471402行
  8. daemontools的安装、简介
  9. OS X桌面自动化神器:Hammerspoon for Mac
  10. 01 Python pikepdf 解锁带有密码的PDF文件
  11. 自定义MySQL实用的函数和存储过程(持续更新)
  12. 体绘制加速技术之数据异步传输
  13. ssl证书过期怎么解决?
  14. SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析
  15. 修改android预览分辨率,wm命令使用方法(修改android 分辨率)修改
  16. simulink他励直流电动机降压调速仿真
  17. Java implement意思_详解JAVA中implement和extends的区别
  18. logback异步输出日志详解
  19. SAP寄售采购的原料可以发给加工商做外协加工吗?
  20. python傅里叶谐波分析_傅里叶变换及其谐波提取

热门文章

  1. ansys怎么合并体_亚马逊合并拆分变体实操(干货)-合并
  2. python提供两个对象身份比较操作符什么和什么来测试_python - 第二部分
  3. [BZOJ3262]陌上花开
  4. Python中str.replace()的使用方法
  5. iOS10 推送通知 UserNotifications
  6. c++.net 托管类封装非托管类
  7. SQL - SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)[转]...
  8. cygwin中 unable get setup.ini from... 的错误问题
  9. Flutter实战视频-移动电商-59.购物车_计算商品价格和数量
  10. MySQL:数据操作