什么是NDK(android native develop kits ):android 本地开发工具集 ,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件.

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

JNI开发用途:驱动开发 (wifi-hotspot) 2.3无线热点共享  ,Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车,opengl,ffmpeg),复用代码(文件压缩,人脸识别…)等。

第一步

1、为了使用studio的Terminal需要把NDK的根目录放到环境变量中,然后重启studio
查看File-->Project Structure-->SDK Location 中第三行 Android NDK location 例如(D:\sdk\ndk-bundle)
可以在local.properties中看到
  1. ndk.dir=D\:\\sdk\\ndk-bundle
  2. sdk.dir=D\:\\sdk

第二步

然后build--Make Project 可以在app/build/intermediates/classes/debug/com/ontim/hellojni/看到MainActivity.class文件)

3、生成头文件,我们要用的命令是javah -d <dir> -classpath <path>
javah是生成jni头文件的命令;    -d是生成的头文件存放的目录(这个目录如果事先没有建立,那么运行成功会自动新建);   <dir>是前面-d选项的目录名称,如果目录是src的话,不要写成<src>!!,直接写src就好;   -classpath从中加载类的路径命令;    <path>是需要生成头文件的class文件的目录。

打开studio的Terminal  --》  cd app/src/main中执行如下

javah -d jni -classpath D:\sdk\platforms\android-24\android.jar;..\..\build\intermediates\classes\debug com.ontim.hellojni.MainActivity

如果提示缺少指定类,缺少v4包,缺少v7包,则用下边最全的(把sdk路径换成自己的,最后的class文件报名改为自己的..\..\build\intermediates\classes\debug com.ontim.hellojni.MainActivity指的是你的class文件);

javah -d jni -classpath D:\sdk\platforms\android-24\android.jar;D:\sdk\extras\extras\android\support\v4\android-support-v4.jar;D:
\sdk\extras\extras\android\support\v7\appcompat\libs\android-support-v4.jar;D:\sdk\extras\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat
.jar;..\..\build\intermediates\classes\debug com.ontim.hellojni.MainActivity

如果出现以下错误(不出现的话最好加上)

Error:Execution failed for task ':app:compileDebugNdk'.> Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

则在fradle.properties中增加

android.useDeprecatedNdk=true

然后就可以在main目录下看到jni文件夹,里面包含.h文件,包含声明方法

4、创建.c文件,用以实现.h头文件中的声明方法
例,一个简单的返回字符串操作方法

  • JNIEXPORT jstring JNICALL Java_com_ontim_hellojni_MainActivity_helloFromC
  • (JNIEnv *env, jobject onj)
  • {
  • return (*env)->NewStringUTF(env,"Hello JNI");
  • }

5  在 jni下创建Android.mk文件

#指定编译的文件夹  指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE    := MyLib
# 编译的源代码的名称
LOCAL_SRC_FILES := hello.c
#编译一个动态库,静态库
#静态库 文件名.a   包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so  包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)<pre name="code" class="html">

6   cd 到jni 目录执行ndk-build.cmd会出现

    D:\code\HelloJNI\app\src\main\jni>ndk-build.cmd[arm64-v8a] Compile        : MyLib <= hello.c[arm64-v8a] SharedLibrary  : libMyLib.so[arm64-v8a] Install        : libMyLib.so => libs/arm64-v8a/libMyLib.so[x86_64] Compile        : MyLib <= hello.c[x86_64] SharedLibrary  : libMyLib.so[x86_64] Install        : libMyLib.so => libs/x86_64/libMyLib.so[mips64] Compile        : MyLib <= hello.c[mips64] SharedLibrary  : libMyLib.so[mips64] Install        : libMyLib.so => libs/mips64/libMyLib.so[armeabi-v7a] Compile thumb  : MyLib <= hello.c[armeabi-v7a] SharedLibrary  : libMyLib.so[armeabi-v7a] Install        : libMyLib.so => libs/armeabi-v7a/libMyLib.so[armeabi] Compile thumb  : MyLib <= hello.c[armeabi] SharedLibrary  : libMyLib.so[armeabi] Install        : libMyLib.so => libs/armeabi/libMyLib.so[x86] Compile        : MyLib <= hello.c[x86] SharedLibrary  : libMyLib.so[x86] Install        : libMyLib.so => libs/x86/libMyLib.so[mips] Compile        : MyLib <= hello.c[mips] SharedLibrary  : libMyLib.so[mips] Install        : libMyLib.so => libs/mips/libMyLib.so

在app buid.gradle中增加

    android {    ...defaultConfig {  ...   ndk {         moduleName "MyLib"  //指定生成动态库的名称       }   }  ...}

在mainactivity中使用

static{System.loadLibrary("MyLib");//不要前缀}
    public class MainActivity extends Activity {static{System.loadLibrary("MyLib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public native String helloFromC();public void click(View view){String str = helloFromC();Toast.makeText(this, str, Toast.LENGTH_SHORT).show();}}

Android studio下的DNK开发JNI详解流程相关推荐

  1. Android Studio安装与App开发步骤详解

    环境准备 使用的软硬件具体如下: Windows 7 Android Studio 3.3.2[简称:AS,从官网可以下载,或者使用低版本升级:help->check for update] J ...

  2. android studio下的NDK开发详解

    点击右边,选择你解压的NDK,点击应用.这一步将工具包关联到android  studio. 在 local.properties 文件中设置ndk的路径: 就是你解压的NDK工具集的路径  我的是  ...

  3. Android Studio项目中Build.gradlle配置详解

    许多对gradlle不了解的宝宝们总是会在配置的过程中遇到一系列的问题,大体都是对gradlle不够了解.所以在此详细说明gradlle中每一项的用处,如下 1. apply plugin: 'com ...

  4. android工程怎么连手机,android studio与手机连接调试步骤详解

    android studio 版本不同连接手机方式有细微的不同,主要方式相似.介绍主要分手机和电脑两部分介绍. 一.手机部分 1.手机端下载一个"一键root权限获取",在安装的过 ...

  5. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为"交叉编译"? 先看什么是 JNI?JNI 的全称就是 Java ...

  6. Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 又掉坑里了 今天开发 uvc,又遇到了坑: 和之前的这个坑类似:Android Studio 下安卓 jni 开发错误 ...

  7. 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)

    Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有 ...

  8. Android Studio下jni应用

    最近在将一个小应用从eclipse开发迁移到android studio,程序中有native代码实现,在eclipse是靠Android.mk这么个mk文件来组织编译的,但到android stud ...

  9. libraries 和android runtime之间的关系,《Android Studio应用开发实战详解》——第1章,第1.3节Android系统架构...

    本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.3节Android系统架构,作者 王翠萍,更多章节内容可以访问云栖社区"异步社区&quo ...

  10. 《Android Studio应用开发实战详解》——第1章,第1.4节Android和Linux的关系

    本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.4节Android和Linux的关系,作者 王翠萍,更多章节内容可以访问云栖社区"异步社 ...

最新文章

  1. [JLOI2013]地形生成
  2. stdarg.h的库函数用法小结
  3. Linux有问必答:如何检查Linux的内存使用状况
  4. 11个笑话让你领悟人生
  5. Spring 获取 request 的几种方法及其线程安全性分析
  6. 抱歉!我不太会修电脑 | 2018年中国程序员研究报告
  7. 编译C#和C++共存的解决方案的小结
  8. mysql 截取json字符串_mysql如何截取一个json字符串?
  9. 【剑指 offer】(31)—— 连续子数组的最大和(动态规划)
  10. 微型计算机在机械设计中的应用,浅谈计算机技术在机械设计制造及自动化中的应用.docx...
  11. 基于Colaboratory平台使用VGGNet网络进行图片分类
  12. applicationhostconfig
  13. react轮播图插件_React 基础面试题 - 和你随便聊聊 React
  14. 霍尔高斯计G81在地磁测量上的运用
  15. js中 json对象与json字符串相互转换的几种方式
  16. 关于SBUS信号在单片机中的一些个人理解
  17. wmv怎么转换成视频mp4
  18. BMP JPEG 图片转换为矢量图像 ContourTrace
  19. 网站一直被大流量DDOS攻击,服务器被打死了怎么办?
  20. 那些你所不知道的结构光技术

热门文章

  1. 《东周列国志》第六十六回 杀宁喜子鱄出奔 戮崔杼庆封独相
  2. bugkuCTF—杂项—旋转跳跃
  3. Echarts 实现环状半圆形饼图
  4. ajax 返回html不返回json,jQuery ajax调用返回HTML而不是JSON的Ajax响应
  5. 松翰触摸单片机SN8F5711
  6. 如何使用计算机远程关闭手机软件,如何用手机远程控制电脑关机
  7. linux内核态访问串口,linux内核中串口驱动注册过程(tty驱动)[转]
  8. dnf 台服服务器pvf修改器,求教怎么用pvf修改器自制装备
  9. 管理:重要性影响力方格
  10. 计算机发送到桌面快捷方式,win10怎么把计算机放到桌面快捷方式