package cn.itcast;

public calss TestNative {

public native void sayHello();

public static void main(String[] arg){

}

}```

2. 用javah.exe生成包含native方法的C/C++头文件

javah -jni(默认)

javah cn.itcast.TestNative //由类名执行生成C/C++头文件

生成的头文件内容:JNIEXPORT void JNICALL Java_cn_itcast_TestNative_SayHello (JNIEnv*, jobject)

3. 参照生成的头文件生成C/C++源文件

在VS下:Win32工程-->DLL-->空的工程-->结束

把生成的头文件引入到C++工程中,从JDK/include和include/win32中

jni.h和jni_md.h文件,然后创建一个新的C++源文件

```java

#include

#include "cn_itcast_TestNative.h"

JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayHello

(JNIEnv* env, jobject obj){

count<

4. 返回Java写Java调用dll代码部分

在主函数中:

System.loadLibrary("nativeCode")//写入你生成的dll文件名,但不要写“.dll”java会自动识别Windows还是Linux系统

new TestNative().sayHello();

运行一下,结果:

Hello world

----

##使用JNI的两个弊端

1. 使用JNI,这个Java Application就不跨平台了,如果要移植到其他平台那么native代码就要重新编写,编译。

2. Java是强类型语言,C/C++不是,因此使用JNI要格外小心

**总之,尽量少用JNI**

本地代码访问Java代码

* 在本地调用的C/C++函数中也可以反过来访问Java程序中的类

* javah工具生成C/C++函数生命中,可以看到两个参数

> JNI* env 实际上代表了Java环境,通过JNIEnv*指针,就可以对Java端代码进行操作,例如:创建Java类的对象,调用Java对象的方法,获取Java对象属性等

* JNIEnv类中有很多函数可以用。

NewObject/NewString/New Array

Get/SetField

CallMethod /CallStaticMethod 等许多函数某个类型的变量

> jobject* obj 被定义为_jobject

* Java操作对象为引入操作,而C/C++中使用指针对对象操作

* jobject* obj 指向一个Java对象的引用,这个对象引用是Java中Native方法所对应的对象

<1>若native方法非静态,它指向native方法所对应的实例

<2>若native方法静态(static)那么它指向native所对应的class对象:Class.class

### Java类型在C/C++中的映射关系

| Java | 本地类型 | JNI定义的别名(jni.h中定义) |

| ------- |:------------------:| -------:|

| int | long | jint/jsize |

| long | _int64 | jlong |

| byte | signed char | jbyte |

| boolean | unsigned char | jboolen |

| char | signed short | jchar |

| short | short | jshort |

| float | float | jfloat |

| double | double | jdouble |

| Object | _jobject* | jobject |

### jclass的取得

typedef _jclass* jclass

为了使C/C++使用Java类,Jni.h头文件中专门定义了jclass类型表示Java中的class类

JNIEnv类中有如下几个简单的函数可以取得jclass:

- jclass FindClass(const char * clsName);

- jclass GetObjectClass (jobject obj);

- jclass GetSuperClass (jclass obj);

Findclass会在classpath系统环境变量下寻找类

传入完整的类名,注意包与包之间是'/'而不是'.'来分隔

如:jclass cls_string=env->FindClass("Java/lang/String")

C/C++访问Java端代码,一个常用的应用就是获取类的属性和调用类的方法,为了在C/C++中表示属性和方法JNI在jni.h头文件中定义了jfieldID,jmethodID分别代表Java端属性和方法

我们在访问或设置Java属性时,必须先取得代表Java属性的jfieldID,然后才可以在本地代码进行Java属性操作;同样,需要使用Java端方法时,也是要取得代表该方法的jmethodID才能对Java方法调用。

使用JNIEnv的GetFieldID/GetMethodID GetStaticFieldID/GetStaticMethodID 来取得相应的jfieldID和jmethodID

* 方法原型:GetFieldID/GetStaticFieldID/GetMethodID/GetStaticMethodID(jclass clazz,const char* name,const char* sign)

如:env->GetMethodID(data_clazz,"","()V")

* Sign签名,用来表示取得的属性/方法的类型

| 类型 | 相应签名 |

| ------- |:------------------:|

| boolean | Z |

| byte | B |

| char | C |

| short | S |

| int | I |

| long | L |

| float | F |

| double | D |

| void | V |

| object | L 用“/”分隔包的完整类名;如:Ljava/lang/String; |

| Array(数组) | [Sign 如[L [Ljava/lang/object; |

| Method | (Type)V 若指定“(I)V” 则取回 void function(int)的jmethodID
若指定“(D)V”则取回void function(double)的jmethodID|

java jni框架,Java JNI 简明教程(一)——传智播客JNI笔记(王泽佑)相关推荐

  1. Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用

    Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用 原创:徐工 2018-5- 5 17.10 package cn.itcast.heima2; import jav ...

  2. java如何做全局缓存_传智播客JNI第七讲 – JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式...

    讲解JNI中的全局引用/局部引用/弱全局引用.缓存jfieldID和jmethodID的两种方式,并编写两种缓存方式的示例代码. 1.从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据 ...

  3. 传智播客java博科学院怎么走_想去传智播客学习大家可不可以给的建议?

    16 岁么 ... 我开始写程序的时候年龄比你小 ... 接触 web 编程时的年龄跟你一样 ... 那个年代的的学习远比现在困难 ... 因为中文网络还没有成型 ... 而以我一个初中生的英文水平完 ...

  4. ios开发基础教程 2014传智播客iOS培训第4期 基础+就业班

    ios培训肯定是靠谱的,因为你想要从事这个行业就必须经过培训,这样才是你进入这个行业的最佳路径.ios现在行业还是挺不错的,企业对ios的人才需求量也大. ios软件工程师月薪多少? ios开发工程师 ...

  5. 传智播客 python 高教产品_《PHP程序设计基础教程》 传智播客高教产品研发部 【正版电子纸书阅读_PDF下载】- 书问...

    目录 第1章PHP开篇 1.1 PHP基础知识 1.1.1 Web技术 1.1.2 PHP概述 1.1.3常用编辑工具 1.2 PHP开发环境搭建 1.2.1 Apache的安装 1.2.2 Apac ...

  6. 传智播客PHP笔记05-thinkphp框架-视图渲染、display,fetch,模板替换,模板变量的赋值与实现,系统变量,模板函数,模板运算符,foreach,if,比较标签,volist标签

    1.视图概述 将具体的视图模板进行输出显示,有两个方法 display:获取具体要输出的内容,然后直接输出 fetch:获取具体要输出的内容,但不会自动输出 2.display的使用(输出模板内容) ...

  7. 广州Java培训机构之广州传智播客Java课程

    广州Java培训机构之广州传智播客Java课程      广州传智播客Java课程,全国领先的Java课程,一群敢于创新,勇于创新的精英老师.广州传智播客Java学科,从开设学科以来,秉承着张孝祥老师 ...

  8. 传智播客ADO.Net项目开发教程详解

    内容简介: 本教程为传智播客.Net培训课堂的现场录像,请到传智播客.Net学院下载更多免费.Net视频教程或者参加讲师现场授课的.Net实地培训班. 视频目录: (一)操作员管理.部门管理.基础数据 ...

  9. 传智播客 java ppt_传智播客XML解析ppt课件

    PPT内容 这是传智播客XML解析ppt课件下载,主要介绍了java解析xml四种方式:Java技术 + XML:基于树的处理:DOM 的问题:SAX的行为:SAX代码例子:SAX的优势:DOM4J, ...

最新文章

  1. 如何使用SearchView过滤RecyclerView
  2. Django 2.2 LTS 发布,长期支持版来了
  3. Android服务一 创建启动服务
  4. Android DEX 基础
  5. Linux必知必会的基本命令和部署项目流程
  6. C#中对泛型List进行分组输出元素
  7. java 聚合函数_如何使用Java流计算两个聚合函数?
  8. iOS 修改webView字体
  9. 函数加正则实现简单计算器
  10. 如何在 iPhone 和 iPad 上关闭 Spotlight 建议?
  11. [7]对话框控件的变量绑定
  12. 海康威视摄像头rtsp推流至H5总结
  13. BUUCTF Cipher writeup
  14. 台式计算机怎么开声音,台式机如何使用耳机说话
  15. IP 库的那些事儿之 2013 - 2014 流水帐版
  16. 计算机中c语言的应用特点,计算机中C语言的应用特点分析
  17. forms组件与Dango回顾
  18. 解析JPEG文件的GPS信息
  19. 从零开始使用AntDB
  20. 性能工具之 Locust 简单入门

热门文章

  1. 牛顿迭代法c 语言程序,牛顿迭代法 c语言实现
  2. 电脑卡在正在启动windows界面_让 Linux 启动更快
  3. tp 数据库查询排序_怎么进行数据库分库分表?
  4. mybatis 插入数据后返回自增id
  5. 第七篇:Spring Boot 整合_Thymeleaf 入门试炼 QuickStart
  6. 大事件后台管理系统开发实战(上)
  7. 记录——oracle数据库备份
  8. python 如何判断一个函数执行完成_三步搞定 Python 中的文件操作
  9. WAM计算机术语,最新的计算机一级考试MSOffice模拟试题及答案
  10. java cookbook 3_CookBook/Java核心/3-Java反射.md at master · zhgdbut/CookBook · GitHub