前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android系统JNI使用(JAVA调用C语言接口)一

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

作者头像
李小白是一只喵
发布2020-04-23 16:00:53
1.4K0
发布2020-04-23 16:00:53
举报
文章被收录于专栏:算法微时光算法微时光

什么是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 入门教程

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是JNI
  • JNI的演化
  • 如何使用JNI
  • Java基本数据类型与C语言基本数据类型的对应
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档