Android JNI 和 NDK

 

1、Android NDK

 一、NDK产生的背景

  Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。

  不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,Android SDK文档里,找不到任何JNI方面的帮助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问Framework API,Debug难度更大等。开发者需要自行斟酌使用。

  于是NDK就应运而生了。NDK全称是Native Development Kit。

  NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。

 

二、为什么使用NDK

  1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

  2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

  3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

  4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

 

三、NDK简介

       1.NDK是一系列工具的集合

       NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

       2.NDK提供了一份稳定、功能有限的API头文件声明

       Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

 

四、NDK开发环境的搭建

1.下载安装Android NDK

 地址:http://developer.android.com/sdk/ndk/index.html

 

2、Android JNI

 native    国的;土著的;天然的;与生俱来的;天赋的

 Native App 本地应用 ; 原生应用 ; 客户端应用 ; 原生应用程式

 

一:基本概念

JNI : Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。

         JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。

 

二:Android JNI 一般用途为:


1、主要是一些算法,因为c/c++比Java效率高,所以应用运行起来速度比较快,特别是一些游戏中的算法。
2、为了保密,都知道apk都可以被反编译,就算有代码混淆,也只是难看懂,并不是完全看不懂,但用jni编译成.so就不同了,所以可以达到商业机密不泄露的目的。
3、一个平台(C++代码)迁移到Android平台,底层逻辑是相同的,这样就可以通过移植,利用JNI调用底层C++代码,避免相同逻辑的代码重复去写,不过这个过程一定要注意底层对象的释放问题。

 

 3、NDK 与 JNI 的关系

 

JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。

JNI 是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。

 

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

 

时间: 2024-09-28 12:55:17

Android JNI 和 NDK的相关文章

android图文介绍NDK安装及简单jni demon的实现

1.背景 android NDK可以用来编译android的native方法,也可以将c和c++的代码编译成.so文件,让android程序运行. 2.NDK安装(linux环境) (1)下载对应的ndk版本,在shell里输入如下命令 gedit ~/.bashrc (2)打开bash文件,添加下载的ndk路径 NDKROOT=/home/CORPUSERS/28852262/android-ndk-r9c export PATH=$NDKROOT:$PATH (3)输入如下命令,然后重启sh

Android 开发 之 JNI入门 - NDK从入门到精通

NDK项目源码地址 :  -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git  -- Java传递参数给C语言实例程序 : GitHub - https://github.com/han1202012/NDKParameterPassing.git  --C语言回调Java方法示例程序 : GitHub - https://github.com/han1202012/NDK_Callback.git

JNI和NDK的区别

NDK(Native Development Kit)"原生"也就是二进制 android常用的开发方式是java封装 的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI (Java Native Interface) 平时用的也就是google给我们封装的好的库,即底层实现用的不是 Java,但都有统一的Java接口 NDK的作用是"我们自己写本地代码"(C/C++),自己用JNI封装 成Java接口 比如我们想做个计

Android中的NDK编程学习

Android应用程序访问android的根文件系统中的文件时,由于应用程序的权 限限制,无法访问这些文件,怎么办? 这时就要用到NDK编程了,既用 C/C++代码实现访问系统文件,并将其生成本地库,供android中的java代码调用 ,这样就可以在java代码中通过调用C/C++编写的库的接口来实现对系统文件的 访问. 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇 难度较大. 2. 在NDK中调用第三方C/

jni和ndk详解

NDK(Native Development Kit)"原生"也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native Interface) 平时用的也就是google给我们封装的好的库,即便是底层实现用的不是Java,但都有统一的Java接口 而NDK的作用是"我们自己写本地代码"(C/C++),自己用JNI封装成Java接口 比如我们想做个计算

Android JNI局部引用表溢出:local reference table overflow (max=512)

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44873769 在<JNI/NDK开发指南(十)--JNI局部引用.全局引用和弱全局引用>这篇文章中详细介绍了在JNI中三种引用的使用方式,区别.应用场景和开发注意事项.由于都是理论,看完之后可能印象不够深刻,由其是在开发当中容易出错的地方.所以这篇文章用一个例子说明引用使用不当会造成的问题,以引起大家对这个知识点的重视. 首先创建一个Android工程,在主界面放一个文本框和一个按钮,

android JNI调用机制

JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主环境. JNI是一个双向的接口:开发者不仅可以通过JNI在Java代码中访问Native模块,还可以在 Native代码中嵌入一个JVM,并通过JNI访问运行于其中的Java模块.可见,JNI担任了一个桥梁的角色,它将JVM与Native模块联系起 来,从而实现了Java代码与Native代码的互访

Ubuntu&amp;amp;nbsp;Android&amp;amp;nbsp;NDK

1.下载NDK:http://developer.android.com/sdk/ndk/index.html 2.下载完成后解压到某一目录,我的是在        zhangweia@ubuntu:~/android/android-ndk-r4b$ pwd /home/zhangweia/android/android-ndk-r4b zhangweia@ubuntu:~/android/android-ndk-r4b$ echo $HOME /home/zhangweia 3.配置NDK的

android JNI调用SDK底层C方法

问题描述 android JNI调用SDK底层C方法 如题:因为上层没法去找到方法,只有想办法去调底层C的方法,SDK源码make出来的.so库文件可以用来做jni的调用么? 底层.c文件里面没有申明JNI,我需要如何去申明 解决方案 你这几个函数的参数,返回值都比较简单,按照JNI的规则,封装导出一下,然后就可以java来调用了 http://www.cnblogs.com/anyanran/archive/2010/11/22/ndk1.html 解决方案二: http://blog.csd