专栏首页算法微时光Android系统JNI使用(JAVA调用C语言接口)一

Android系统JNI使用(JAVA调用C语言接口)一

什么是JNI

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信主要是C/C++。

从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。

使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。

例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

JNI的演化

JDK1.0包含了一个本地方法接口,它允许JAVA程序调用C/C++写的程序,许多第三方的程序和JAVA类库。如:java.lang,java.io,java.net等都依赖于本地方法来访问底层系统环境的特征。

不幸的是,JDK1.0中的本地方法有两个主要问题:

1、本地方法想访问C中的结构(structures)一样访问对象中的字段。尽管如此,JVM规范并没有定义对象怎么样在内存中实现。如果一个给定的JVM实现在布局对象时,和本地方法假设的不一样,那你就不得不重新编写本地方法库。

2、因为本地方法可以保持对JVM中对象的直接指针,所以,JDK1.0中的本地方法采用了一种保守的GC策略。

JNI的诞生就是为了解决这两个问题,它可以被所有平台下的JVM支持:

(1)每一个JVM实现方案可以支持大量的本地代码。

(2)开发工具作者不必处理不同的本地方法接口。

(3)本地代码可以运行在不同的JVM上面。

JDK1.1中第一次支持JNI,但是,JDK1.1仍在使用老风格的本地代码来实现JAVA的API。这种情况在JDK1.2下被彻底改变成符合标准的写法。

如何使用JNI

调用顺序:

  1. 编写带有native声明的方法的java类
  2. 编译所编写的java类
  3. 使用javah + java类名生成扩展名为h的头文件
  4. 将C/C++编写的文件生成动态连接库

Java基本数据类型与C语言基本数据类型的对应

Java Type

JNI Type

C Type

描述

boolean

jboolean

unsigned char

unsigned 8 bits

byte

jbyte

signed char

signed 8 bits

char

jchar

unsigned short

unsigned 16 bits

short

jshort

short

signed 16 bits

int

jint

long

signed 32 bits

long

jlong

_int64

signed 64 bits

float

jfloa

float

32 bits

double

jdouble

double

64 bits

通过源码学习,让我们直观的看下源码中是怎么定义的: libnativehelper/include_jni/jni.h

java对象映射到c++中:

所有的_j开头的类,都是继承于_jobject,这也是Java语言的特别,所有的类都是Object的子类,这些类就是和Java中的类一一对应,只不过名字稍有不同而已。

参考

JNI 学习笔记 JNI介绍 一天掌握Android JNI本地编程 快速入门 JNI 入门教程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • adb查看/修改android系统属性

    李小白是一只喵
  • ubuntu配置jre8

    移动解压包到/usr/lib/java: 注意:执行前却多该目录下有java文件夹,如果没有请先创建

    李小白是一只喵
  • 深度学习之开启神经网络之旅

    这是一个特殊的有向图,θ称为权重,x0称为偏置项,函数f是激活函数。在感知器模型中,激活函数是sign;在逻辑回归中,激活函数是sigmoid。

    李小白是一只喵
  • JNI简介

    用户1665735
  • 最熟悉又陌生的5大概念之“JRE、JDK、J2SE、J2EE、J2ME”

    看完标题,大家可能会有疑问,什么叫最熟悉又陌生的概念;说最熟悉是因为这些概念经常听到或看到,陌生是因为不了解它们的真正含义,怎么用,什么时候会用到;如果你觉得这...

    用户1289394
  • 《Java程序设计基础》 第2章手记

    前言: 本手记以大学Java教学书籍《Java程序设计基础》第四版(清华大学出版社 陈国君等编著)为背景,每周更新一次,内容涉及学习这本书中可能遇到的问题及其解...

    Steve Wang
  • 厉害了,Java EE 再次更名为 Jakarta EE

    https://www.oschina.net/news/108108/java-ee-rename-as-jakarta-ee

    Java技术栈
  • 终于定了!Java EE正式更名Jakarta EE!

    Eclipse基金会最近对Java EE标准的每个规范进行了重命名,阐明了每个规范在Jakarta EE平台未来的角色。 新的名称Jakarta EE是Java...

    框架师
  • 现实版“柯南变声领结”!搜狗输入法“变声”功能发布,千人千声一键转换

    在动画片《名侦探柯南》中,阿笠博士送给柯南的变声领结是柯南破案的重要道具,得益于它,柯南可以将声音伪装成其他人,在不暴露身份的情况下巧妙破案。

    量子位
  • 【趣学程序】Linux流程语句

    趣学程序

扫码关注云+社区

领取腾讯云代金券