最权威的文档请见JNI

一、JNI概述

  在某些情况下,单独使用Java编程无法满足开发者的需求,这时可以使用JNI(Java Native Interface)来处理。常见的需要使用JNI的场景有:

(1)标准Java类库不支持应用程序所需的平台相关特性。
(2)存在其他语言编写的库,并且希望通过JNI使Java代码能够使用该库。
(3)用低级语言(如汇编)实现一小部分时间关键型代码。

  通过JNI编程,可以使用native methods做到:

(1)创建、检查和更新Java对象(包括数组和字符串)。
(2)调用Java方法。
(3)捕获并抛出异常。
(4)加载类并获取类信息。
(5)执行运行时类型检查。

二、JNI类型对应

2.1 基础类型

2.2 引用类型


在C++中:

class _jobject {};
class _jclass : public _jobject {};
// ...
typedef _jobject *jobject;
typedef _jclass *jclass;

2.3 值类型

typedef union jvalue {jboolean z;jbyte    b;jchar    c;jshort   s;jint     i;jlong    j;jfloat   f;jdouble  d;jobject  l;
} jvalue;

2.4 类型签名


对于以下Java方法:

long f (int n, String s, int[] arr);

具有如下签名(signature):

(ILjava/lang/String;[I)J

三、JNI函数操作

JNI方法列表请见:Interface Function Table

(1)其中有对象操作方法如:

jobject NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);

其中参数:
env: JNI 接口指针,不能为null
clazz: Java类对象的引用,不能为null
methodID: 构造函数的MethodID,可以通过GetMethodID()获得

(2)其中有对象Fileld 访问方法如:

jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

其中参数:
env: JNI 接口指针,不能为null
clazz: Java类对象,不能为null
name: 字段名的UTF-8 string, 不能为null
sig: 字段签名的UTF-8 string, 不能为null

…方法较多就不再继续罗列。

四、native方法注册

JVM有两种方法来查找native方法并将其与Java代码链接。第一种方法是以特定的命名方式命名native 函数,以便JVM能够找到它。另一种方法是使用JNI RegisterNatives()方法,RegisterNatives()使用作为参数传递的类注册本机方法。通过使用这种方法,我们可以随意命名C++函数。java.lang.Object的registerNatives()方法使用了第二种方法。让我们看看C语言中OpenJDK 8中java.lang.Object的registerNatives()方法实现:

static JNINativeMethod methods[] = {{"hashCode",    "()I",                    (void *)&JVM_IHashCode},{"wait",        "(J)V",                   (void *)&JVM_MonitorWait},{"notify",      "()V",                    (void *)&JVM_MonitorNotify},{"notifyAll",   "()V",                    (void *)&JVM_MonitorNotifyAll},{"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},
};JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{(*env)->RegisterNatives(env, cls,methods, sizeof(methods)/sizeof(methods[0]));
}

五、使用JNI例子

public class RegisterNativesHelloWorldJNI {public native void register();public native String sayHello();public static void main(String[] args) {RegisterNativesHelloWorldJNI helloWorldJNI = new RegisterNativesHelloWorldJNI();helloWorldJNI.register();helloWorldJNI.sayHello();}
}
//c++注册实现
static JNINativeMethod methods[] = {{"sayHello", "()Ljava/lang/String;", (void*) &hello },
};JNIEXPORT void JNICALL Java_com_baeldung_jni_RegisterNativesHelloWorldJNI_register (JNIEnv* env, jobject thsObject) {jclass clazz = env->FindClass("com/baeldung/jni/RegisterNativesHelloWorldJNI");(env)->RegisterNatives(clazz, methods, sizeof(methods)/sizeof(methods[0]));
}JNIEXPORT jstring JNICALL hello (JNIEnv* env, jobject thisObject) {std::string hello = "Hello from registered native C++ !!";std::cout << hello << std::endl;return env->NewStringUTF(hello.c_str());
}

打印:

Hello from registered native C++ !!

Android_JNI编程入门相关推荐

  1. python编程求圆的面积案例_Python实用案例编程入门:第七章 调式手段

    本章的主题为调试手段,这是程序开发必不可少的步骤,也是占用时间最多的环节.在程序员的正常开发工作中,调试工作至少占据1/3的时间,而实际编码工作相对占用实际比较少.因此,无论您是初学者,还是编程兴趣爱 ...

  2. 《C++游戏编程入门(第4版)》——1.12 习题

    本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.1节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...

  3. 编程入门到进大厂,你需要这套学习架构

    我相信大多数学习编程的同学都有着对大公司的憧憬.技术.声望.薪资.福利,这些都足以成为吸引你进入大厂的理由. 但是,如何进入大厂呢? 对于很多同学来说,通往大厂的道路并不明朗,不知道是否有希望,也不知 ...

  4. 《C++游戏编程入门(第4版)》——1.8 Lost Fortune简介

    本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.8节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...

  5. [译]函数式响应编程入门指南

    原文地址:An Introduction to Functional Reactive Programming 原文作者:Daniel Lew 译文出自:掘金翻译计划 本文永久链接:github.co ...

  6. 《C++游戏编程入门(第4版)》——2.4 使用带else子句的if语句序列

    本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第2章,第2.4节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...

  7. 《树莓派Python编程入门与实战》——3.5 关于Python交互式shell

    本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第3章,第3.5节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  8. 编程指南_今晚7点,译者编程入门指南抽奖!

    各位关注"简言"的同学们好.老师们! 我的新书<译者编程入门指南>出版啦!感谢大家一直以来的支持和陪伴,我每次发完文章后都会得到大家的点赞.转发.留言甚至打赏,我感到非 ...

  9. 《树莓派Python编程入门与实战(第2版)》——3.9 小结

    本节书摘来自异步社区<树莓派Python编程入门与实战(第2版)>一书中的第3章,第3.9节,作者[美] Richard Blum Christine Bresnahan,陈晓明 马立新 ...

  10. 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记

    <Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...

最新文章

  1. openJDK之sun.misc.Unsafe类CAS底层实现
  2. 计算机应用基础知识点.pdf,《计算机应用基础》复习知识点.pdf
  3. flash 遮罩层全解
  4. QPainter类的CompositionMode各值含义
  5. DBlink的创建与删除
  6. 把UltraEdit改造成VC
  7. VS2012下基于Glut 矩阵变换示例程序2:
  8. ftp 530 This FTP serveris anonymous only,
  9. iMeta | 南医大余光创组ggtree最新文章-系统发育树存储与可视化的数据结构
  10. android开发连接手机usb调试模式,安卓手机usb调试在哪里 安卓手机usb调试模式设置教程...
  11. Spring Boot Admin
  12. ORCLE导出数据,加不加owner,ORACLE常用的导出语句
  13. [从头读历史] 第280节 诗经目录以及十五国风的地域分布
  14. 骑士cms文件包含getshell复现
  15. Android存储路径解析
  16. QA之道知多少(一) 初出茅庐
  17. IT“茫一代”:35岁成生死线 无处安放未来
  18. 微信小程序码的生成(JAVA完整版) 亲测可用
  19. 解读Git与SVN的区别(集中式VS分布式)
  20. python中使用scipy.integrate求积分、二重积分、三重积分

热门文章

  1. rda冗余分析步骤_使用CANOCO进行CCA或RDA教程分析.ppt
  2. 计算机硕士-工资一览表
  3. 2020年低压电工模拟考试题及低压电工实操考试视频
  4. Android富文本编辑器RichEditor的使用
  5. MariaDB安装配置
  6. ACOPTools:一步步帮你快速、高效构建多基因联合系统发育树
  7. android开发骰子动画,Android实现微信摇骰子游戏
  8. OTSU算法 (大津算法)理解代码
  9. NLP实战 | BERT文本分类及其魔改(附代码)
  10. 那些堪称软件神器的工具或网站