java jni框架,Java JNI 简明教程(一)——传智播客JNI笔记(王泽佑)
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笔记(王泽佑)相关推荐
- Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用
Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用 原创:徐工 2018-5- 5 17.10 package cn.itcast.heima2; import jav ...
- java如何做全局缓存_传智播客JNI第七讲 – JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式...
讲解JNI中的全局引用/局部引用/弱全局引用.缓存jfieldID和jmethodID的两种方式,并编写两种缓存方式的示例代码. 1.从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据 ...
- 传智播客java博科学院怎么走_想去传智播客学习大家可不可以给的建议?
16 岁么 ... 我开始写程序的时候年龄比你小 ... 接触 web 编程时的年龄跟你一样 ... 那个年代的的学习远比现在困难 ... 因为中文网络还没有成型 ... 而以我一个初中生的英文水平完 ...
- ios开发基础教程 2014传智播客iOS培训第4期 基础+就业班
ios培训肯定是靠谱的,因为你想要从事这个行业就必须经过培训,这样才是你进入这个行业的最佳路径.ios现在行业还是挺不错的,企业对ios的人才需求量也大. ios软件工程师月薪多少? ios开发工程师 ...
- 传智播客 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 ...
- 传智播客PHP笔记05-thinkphp框架-视图渲染、display,fetch,模板替换,模板变量的赋值与实现,系统变量,模板函数,模板运算符,foreach,if,比较标签,volist标签
1.视图概述 将具体的视图模板进行输出显示,有两个方法 display:获取具体要输出的内容,然后直接输出 fetch:获取具体要输出的内容,但不会自动输出 2.display的使用(输出模板内容) ...
- 广州Java培训机构之广州传智播客Java课程
广州Java培训机构之广州传智播客Java课程 广州传智播客Java课程,全国领先的Java课程,一群敢于创新,勇于创新的精英老师.广州传智播客Java学科,从开设学科以来,秉承着张孝祥老师 ...
- 传智播客ADO.Net项目开发教程详解
内容简介: 本教程为传智播客.Net培训课堂的现场录像,请到传智播客.Net学院下载更多免费.Net视频教程或者参加讲师现场授课的.Net实地培训班. 视频目录: (一)操作员管理.部门管理.基础数据 ...
- 传智播客 java ppt_传智播客XML解析ppt课件
PPT内容 这是传智播客XML解析ppt课件下载,主要介绍了java解析xml四种方式:Java技术 + XML:基于树的处理:DOM 的问题:SAX的行为:SAX代码例子:SAX的优势:DOM4J, ...
最新文章
- 如何使用SearchView过滤RecyclerView
- Django 2.2 LTS 发布,长期支持版来了
- Android服务一 创建启动服务
- Android DEX 基础
- Linux必知必会的基本命令和部署项目流程
- C#中对泛型List进行分组输出元素
- java 聚合函数_如何使用Java流计算两个聚合函数?
- iOS 修改webView字体
- 函数加正则实现简单计算器
- 如何在 iPhone 和 iPad 上关闭 Spotlight 建议?
- [7]对话框控件的变量绑定
- 海康威视摄像头rtsp推流至H5总结
- BUUCTF Cipher writeup
- 台式计算机怎么开声音,台式机如何使用耳机说话
- IP 库的那些事儿之 2013 - 2014 流水帐版
- 计算机中c语言的应用特点,计算机中C语言的应用特点分析
- forms组件与Dango回顾
- 解析JPEG文件的GPS信息
- 从零开始使用AntDB
- 性能工具之 Locust 简单入门
热门文章
- 牛顿迭代法c 语言程序,牛顿迭代法 c语言实现
- 电脑卡在正在启动windows界面_让 Linux 启动更快
- tp 数据库查询排序_怎么进行数据库分库分表?
- mybatis 插入数据后返回自增id
- 第七篇:Spring Boot 整合_Thymeleaf 入门试炼 QuickStart
- 大事件后台管理系统开发实战(上)
- 记录——oracle数据库备份
- python 如何判断一个函数执行完成_三步搞定 Python 中的文件操作
- WAM计算机术语,最新的计算机一级考试MSOffice模拟试题及答案
- java cookbook 3_CookBook/Java核心/3-Java反射.md at master · zhgdbut/CookBook · GitHub