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|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java自定义变量解析,Thymeleaf内置对象、定义变量、URL参数及标签自定义属性

如标题所述&#xff0c;这篇文章主要讲述Thymeleaf中的内置对象(list解析、日期格式化、数字格式化等)、定义变量、获取URL的参数和在页面标签中自定义属性的应用。如果对Thymeleaf的基本使用、maven依赖等不清楚的可以先阅读我的另一篇文章《Thymeleaf 之 初步使用》。Control…

linux php curl.so,linux中php如何安装CURL扩展方法

如果php已经在系统编译好&#xff0c;后来又需要添加新的扩展。一种方式就是重新完全编译php&#xff0c;另一种方式就是单独编译扩展库&#xff0c;以extension的形式扩展。下面以安装curl扩展为例&#xff1a;1、下载curl安装包。(我的php是4.4.4的&#xff0c;下载最新的cur…

matlab线性拉伸函数,采用线性变换对图像的每一个像素灰度作线性拉伸-Read.PPT

采用线性变换对图像的每一个像素灰度作线性拉伸-Read第4章 图像增强(1) 4.1 图像增强概述 图像增强(image enhancement)的定义&#xff1a; 在图像的获取过程中&#xff0c;由于多种因素的影响&#xff0c;导致图像质量退化。图像增强是对退化图像的某些特征&#xff0c;如边缘…

php js 循环对象属性,js 遍历对象的属性的代码_javascript技巧

如&#xff1a;Function.prototype.addMethodfunction(methodName,func){if(!this.prototype[methodName]){this.prototype[methodName]func;//给原型增加方法&#xff0c;此方法会影响到该类型的实例上}return this.prototype;//返回原型&#xff0c;此类型实例可以进行链形调…

php连接数据库navicat,navicat数据库如何连接php

第一步&#xff0c;打开Navicat&#xff0c;新建数据库。第二步&#xff0c;在数据库中新建表。相关推荐&#xff1a;《Navicat for mysql使用图文教程》第三步&#xff0c;保存表。第四步&#xff0c;表中添加数据。第五步&#xff0c;打开ide&#xff0c;输入以下php代码&…

每日一题:LCR 095.最长公共子序列(DP)

题目描述&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

php自动合并,php实现合并数组并去除重复的方法

php实现合并数组并去除重复的方法发布时间&#xff1a;2020-08-12 10:35:05来源&#xff1a;亿速云阅读&#xff1a;99作者&#xff1a;小新这篇文章主要介绍了php实现合并数组并去除重复的方法&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这…

oracle存储数据方式,Oracle 数据类型及存储方式

Oracle 数据类型及存储方式袁光东 原创概述通过实例&#xff0c;全面而深入的分析oralce的基本数据类型及它们的存储方式。以ORACLE 10G为基础&#xff0c;介绍oralce 10g引入的新的数据类型。让你对oracle数据类型有一个全新的认识。揭示一些不为人知的秘密和被忽略的盲点。从…

oracle的一些基本操作,Oracle中的一些基本操作

关于Oracle中的一些基本操作&#xff0c;包括表空间操作&#xff0c;用户操作&#xff0c;表操作1 --创建表空间2 create tablespace itheima3 datafile I:\oracle\table\itheima.dbf4 size 100m5 autoextend on6 next 10m;7 --删除表空间8 drop tablespace itheima;910 --创建…

oracle全局批准供应商,Oracle EBS-SQL (PO-7):检查异常-非批准的供应商设置供货比例.sql...

select distinctmsr.sourcing_rule_name 名称,msi.description 说明,msi.item_type 类型,msi.inventory_item_status_code 状态,msr.planning_active 计划生效,msro.effective_date 有…

linux 临时文件 锁,linux – 无法使用文件描述符flock锁定文件

您正在使用-n,如果无法立即获取锁定将终止,并且flock将以退出代码1失败.因此,在第一个终端中执行代码后,它会休眠100秒.接下来当你在另一个终端中执行相同的操作时,flock会失败并返回1,但是因为有一个;并且您不对返回代码执行任何操作,shell只是继续执行下一个语句并休眠100秒.…

linux内核运行关系图,一张图看懂Linux内核运行交互关系

很多朋友如果接触过Linux的都知道Kernel的含义&#xff0c;kernel是操作系统的核心或者最重要的部分。众所周知的是&#xff0c;几乎整个互联网都运行在 Linux上&#xff0c;从网络协议&#xff0c;到服务器&#xff0c;到你平常访问的绝大多数网站&#xff0c;都能看到它的身…

win7下访问linux文件权限,linux中文件的权限

一、文件的基本权限权限&#xff1a;r, w, x对于文件来讲&#xff0c;r:&#xff1a;可读&#xff0c;可以使用类似cat等命令查看文件内容&#xff1b;w:可写&#xff0c;可以编辑或删除此文件&#xff1b;x:可执行&#xff0c;exacutable&#xff0c;可以命令提示符下当作命令…

linux头文件怎么编译,microsoft编译器怎么使用Linux头文件

microsoft编译器如何使用Linux头文件?#include #include #include #include #include #include #include #include #include #include #include #include #include 分享到&#xff1a;------解决方案--------------------windows 对应 上面头文件 是哪个呀?引用:一般都是网络…

linux程序多少位,查看linux版本是多少位

1 查看内核版本&#xff1a;1)[rootLinux download]# cat /proc/versionLinux version 2.6.18-194.el5 (mockbuildbuilder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 14:58:35 EDT 20102)[rootLinux download]# uname -aLinux Linux 2.…

linux内核bios,BIOS的启动原理——Linux内核设计学习笔记

RAM&#xff1a;随机存取存储器&#xff0c;常见的内存条就是一类RAM&#xff0c;其特点是加电状态下可任意读、写&#xff0c;断电后信息消失。在RAM中什么程序也没有的时候&#xff0c;谁来完成加载软盘中操作系统的任务呢&#xff1f;答案是&#xff1a;BIOS。BIOS的启动原理…

zabbix监控linux网卡流量,zabbix实现linux流量变化率监控

监控软件&#xff1a;zabbix需求分析&#xff1a;从系统层面的监控看&#xff0c;现在CPU持续超过80%会报警&#xff0c;流量曲线达到阀值才会报警&#xff0c;但是流量在短时间内起伏很大&#xff0c;肯定是有问题的&#xff0c;目前主要还是依靠人看&#xff0c;肯定有滞后性…

Linux下仿windows任务管理器,开源任务管理器 Process Hacker (Windows)

Windows表面上没有工作在进行中&#xff0c;但不知为何负荷很重&#xff0c;究竟有什么进程在执行&#xff1f;会不会是系统已经被入侵&#xff1f;这是很多人都想知道的问题。但Windows自带的任务管理员实在太过简陋&#xff0c;解决办法便是安装这次介绍的Process Hacker。熟…

linux软件工程师笔试题,C/C++软件工程师笔试题

1&#xff0c;程序设计(可以用自然语言来描述&#xff0c;不编程)&#xff1a;C/C源代码中&#xff0c;检查花括弧(是“(”与“)”&#xff0c;“{”与“}”)是否匹配&#xff0c;若不匹配&#xff0c;则输出不匹配花括弧所在的行与列。2&#xff0c;巧排数字&#xff0c;将1,2…

嵌入式linux中的锁机制,跟涛哥一起学嵌入式第11集:一个实现锁机制非常有意思的宏...

QQ群(宅学部落)有位学员问了一个很奇怪的宏&#xff0c;觉得很有意思&#xff0c;特拿来分享&#xff0c;它的定义如下:我们知道&#xff0c;宏定义其实就是为了方便&#xff0c;给一串代码字符串定义一个别名。有时候字符串过于复杂&#xff0c;我们可以分多行书写&#xff0c…