Android JNI -基础篇

JNI(Java Native Interface,JAVA本地接口) 可以使Java代码和其他语言写的代码(如C/C++代码)进行交互。为什么要进行交互? 首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低,如下图所示。其次,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能,而且使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率。

使用JNI技术,其实就是在Java程序中,调用C语言的函数库中提供的函数,来完成一些Java语言无法完成的任务。由于Java语言和C语言结构完全不相同,因此若想让它们二者交互,则需要制定一系列的规范。JNI就是这组规范,此时Java只和JNI交互,而由JNI去和C语言交互。

JNI技术分为两部分:Java端和C语言端。且以Java端为主导。首先,Java程序员在Java端定义一些native方法,并将这些方法以C语言头文件的方式提供给C程序员。 然后,C程序员使用C语言,来实现Java程序员提供的头文件中定义的函数。接着,C程序员将函数打包成一个库文件,并将库文件交给Java程序员。 最后,Java程序员在Java程序中导入库文件,然后调用native方法。

在Java程序执行的时候,若在某个类中调用了native方法,则虚拟机会通过JNI来转调用库文件中的C语言代码。提示:C代码最终是在Linux进程中执行的,而不是在虚拟机中。

交叉编译:

在一个平台下编译出在另一个平台中可以执行的二进制代码。Google提出的NDK就可以完成交叉编译的工作。原理就是将中间代码连接成当前计算机可执行的二进制程序时,连接程序会根据当前计算机的CPU、操作系统的类型来转换。根据运行的设备的不同,可以将cpu分为: arm结构 :主要在移动手持、嵌入式设备上。 x86结构 : 主要在台式机、笔记本上使用。如Intel和AMD的CPU 。

若想在使用了基于x86结构CPU的操作系统中编译出可以在基于arm结构CPU的操作系统上运行的代码,就必须使用交叉编译。

Android NDK

NDK(Native Development Kit)是一系列工具的集合,它有很多作用。首先,NDK可以帮助开发者快速开发C(或C++)的动态库。其次,NDK集成了交叉编译器。使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

NDK工具必须在Linux下运行,它可以在linux环境下编译出可以在arm平台下运行的二进制库文件。

C动态库

动态库:在编译用户程序时不会将用户程序内使用的库函数连接到用户程序的目标代码中,只有在运行时,且用户程序执行到相关函数时才会调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。 静态库:在编译用户程序时会将其内使用的库函数连接到目标代码中,程序运行时不再需要静态库。使用静态库生成可执行文件比较大。

在Linux中,静态库命名一般为:lib+库名+.a 。如:libcxy.a 其中lib说明此文件是一个库文件,cxy是库的名称,.a说明是静态的。 动态库命名一般为:lib+库名+.so 。.so说明是动态的。

编写一个可以与C代码交互的android工程需要如下步骤:

JAVA代码中写声明native 方法 public native String helloFromJNI();

创建jni目录,编写c代码,方法名字要对应

编写Android.mk文件(交叉编译的规范)

Ndk编译生成动态库

Java代码load 动态库.调用native代码

时间: 2024-11-14 21:30:15

Android JNI -基础篇的相关文章

Android JNI基础篇

https://blog.csdn.net/quwei3930921/article/details/78820991 ①JNI是什么?Java Native Interface,它是java和C/C++相互通信的接口. ②JNI需要引入jni.h头文件 ③加载so库 System.loadLibrary(libname); ④android studio通过CMakeLists.txt文件配置需要生成的so库,通过cmake命令来生成so库; ⑤CMakeLists.txt配置详情 add_l

Android【基础篇】

一 通信技术 1G:    通信标准:模拟制式                   只能进行语音通话,不能发送短信 2G:    通信标准:数字制式:GSM和CDMA 收发短信和邮件 2.5G: 通信标准: GPRS,EDGE            访问wap网络数据(图片,壁纸,文字信息) 3G:     通信标准: WCDMA(联通),CDMA2000(电信),TD-SCDMA(移动)  发微博,上qq,查看高清图片,电影(看电影还不成熟) 3.5G: 通信标准: WCDMA延伸的技术:HS

Android ListView优化篇

在我的上一篇博客<Android ListView基础篇>中陈列了ListView和adapter的多种结合方式的基本使用,在本篇文章中将具体讲述如何通过多种方式处理好ListView的优化问题. 在上篇文章的例子中,我们使用了一张图片和一个文本作为每一行的数据,发现效果已经完全达到了,而且没出现什么问题.但如果我们将Item的数量调大,比如调到1000.10000.100000条数据,这个时候当你打开ListView的时候,肯定会不禁感慨"什么鬼,卡机了?!"等了好几秒钟

android基础篇学习心得

android技术中,线程.进程.JNI.IPC和各个小框架结构是基本功.在跟随高焕堂老师的android程序猿到架构师之路系列视频中 学习完基础篇之后,颇有些心得,记录下来. android开发就是app开发吗?曾听过很多人说android学习很简单,做个app轻松就上手了.我一直觉得不以为然,许多程序员做app开发时,心中大致只有四大组件.各种布局.数据库和一些常用控件.对于各小框架.线程间通信.绑定服务.java与c的对接等基本原理并不清楚,也没必要弄清楚. 最近学校搞了一个实训,要求做一

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法的中文API Android JNI学习(五)——Demo演示 本片文章大纲如下: 1.导读 2.什么是NDK 3.为什么使用NDK 4.NDK到SO 5.JNI 大纲.png 一.导读 在Android OS上开发应用程序,Goog

ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map

原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/arcgis_mobile/article/details/8124005 通过上面章节,我们已经了解如何配置一个ArcGIS Runtime for Android开发环境,下面我们将介绍如何使用Eclipse创建一个ArcGIS移动项目Hello W

基础篇:6.Android数据库编程---SQLite

简介: 在Android平台上,继承了一个嵌入式关系型数据库---SQLite.SQLite具有跨平台特性,可以在所有主要的操作系统上运行.SQLite通过独占性和共享锁实现独立事务处理,因此多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据,在进行写操作之前,必须先获得独占锁.另一方面,SQLite采取动态数据类型,当某个值插入数据库时,SQLite会检查它的类型,如果该类型与所关联的列不匹配,SQLite则会进行强制转换.SQLite支持以下几种数据类型:NULL(空值).I

ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView

原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/arcgis_mobile/article/details/8147328 MapView是ArcGIS Runtime SDK forAndroid的核心组件,通过MapView可以呈现地图服务的数据,并且在MapView中定义了丰富的属性.方法和事件,用户通过Map

八、android jni 之C语言基础

*含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址的变量 打印数据类型 %d - int %ld – long int %c - char %f - float %lf – double %x – 十六进制输出 int或者long int或者short int %o - 八进制输出 %s – 字符串 3.指针 指针就是地址. 热身小程序 介绍指针

ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件

转自:http://blog.csdn.net/arcgis_mobile/article/details/8263283 ArcGIS Runtime sdk for Android为我们提供了丰富的事件监听器,本节将主要介绍我们经常使用的监听器,并且介绍通过这些监听器可以实现哪些功能,在下面的监听器中只有MapOnTouchListener是类,其他皆为接口类型,如图所示: 1.1 MapOnTouchListener MapOnTouchListener是MapView最为重要的监听器之一