java native方法_并发系列-native函数回调Java方法原理实践
写在前面
上一篇分享了Java调用native函数过程原理实践,文章最后留了一个问题,本章主要对C程序回调我们的Java程序原理进行实践。
调用C程序之后他是怎么知道来调用我们我们的哪个方法?又是如何进行调用的呢?带着这两个疑问往下看。
run方法是怎么执行的?这里分六个步骤来进行验证:
1、修改代码,让c程序来调用这里的run方法
package org.xinhua.cbcloud.util;public class ThreadTest { static { // 装载库,保证JVM在启动的时候就会装载,故而一般是也给static System.loadLibrary( "ThreadTestNative" ); } public static void main(String[] args) { ThreadTest threadTest =new ThreadTest(); threadTest.start0(); } public void run(){ System.out.println("I am java Thread !!"); } private native void start0();}
2、javac编译java文件生成.class文件
3、javah生成头文件
4、编写thread3.c 文件
#include#include#include "org_xinhua_cbcloud_util_ThreadTest.h"pthread_t pid;JNIEXPORT void JNICALL Java_org_xinhua_cbcloud_util_ThreadTest_start0(JNIEnv *env, jobject obj){jint ret = 0;//获取java类 printf("init");jclass cls = (*env)->FindClass(env,"org/xinhua/cbcloud/util/ThreadTest");if(cls==NULL){printf("find Class error!");return;}//获取java类构造方法jmethodID cid =(*env)->GetMethodID(env,cls,"","()V");if(cid==NULL){printf("find constructor error!");return;}//创建对象jobject job = (*env)->NewObject(env,cls,cid,NULL);if(job==NULL){printf("new instance error!");return;}//获取java的run方法jmethodID tid =(*env)->GetMethodID(env,cls,"run","()V");if(tid==NULL){printf("find constructor error!");return;}//回调方法ret = (*env)->CallIntMethod(env,job,tid,NULL);printf("finish JNICall!");}int main(){return 0;}
5、生成动态库链接文件
gcc -fPIC -I /usr/lib/jvm/java-1.8.0-openjdk/include -I /usr/lib/jvm/java-1.8.0-openjdk/include/linux -shared -o libThreadTestNative.so thread3.c
6、执行测试
回调成功
写在最后
本章对一些编译、生成头文件的之后的操作没有操作截图,在上一篇已经详细介绍过了,有不明白的可以结合上一篇一起来看,如果还是有不明白的地方可以给我留言。
java native方法_并发系列-native函数回调Java方法原理实践相关推荐
- creator owner是什么用户_并发系列-到底什么重量级锁?
本章概述 很多人对锁的理解大概都只是一个概念,那到底什么是重量级锁?不了解重量级锁怎么能看懂偏向锁.轻量级锁,1.6之后对重量级锁的优化并不是因为他重,主要还是因为业务场景,重量级锁存在的原因是因为他 ...
- java 检视_Java高并发系列——检视阅读(五)
JUC中工具类CompletableFuture CompletableFuture是java8中新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类,熟悉一下. Co ...
- c++怎么将两个类的方法集合成一个类的方法_一文帮你梳理 Java 集合
集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在 IDE 上龙飞凤舞,但是作为一名合格的优雅的程序猿 ...
- Java并发系列(11)——ThreadPoolExecutor实现原理与手写
接上一篇<Java并发系列(10)--FutureTask 和 CompletionService> 文章目录 9 线程池 9.1 JDK 线程池 9.2 ThreadPoolExecut ...
- java实现分而治之_并发编程中一种经典的分而治之的思想!!
写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...
- java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)
对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一个程序 ...
- 我的世界手机版java安装失败_我的世界中国版JAVA路径错误的解决方法分享
我的世界中国版JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?九游必须 ...
- aop 获取注解注释的方法_带有AOP和注释的Java方法记录
aop 获取注解注释的方法 有时,我想记录(通过slf4j和log4j )方法的每次执行,查看其接收的参数,返回的内容以及每次执行花费的时间. 这是我在AspectJ , jcabi-aspects和 ...
- java获取系统时间的几种方法_获取当前时间的几种方法整理(Java)
在java中有很多方法可以取到系统时间,记一下最简单的那种 //使用Calendar 获取当前日期和时间 Calendar calendar = Calendar.getInstance(); // ...
最新文章
- [CLPR] 定位算法探幽 - 边缘和形态学
- php采集绕过cloudflare,三行代码带你绕过cloudflare反爬
- python为什么import不了_python – 为什么PyImport_Import无法从当前目录加载模块?
- 深入理解控制反转(IoC)和依赖注入(DI)
- 机器学习代码实战——梯度下降(gradient descent)
- Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明)
- linux安装文件密码,linux安装包PGP加密验证
- python调用打印机驱动下载_不要驱动,简单粗暴的用树莓派驱动USB打印机
- python 让电脑发出声音代码_python - 代码完成时发出声音警报
- ad网络标号怎么用_altium designer网络标号的作用范围
- [机器学习入门] 李宏毅机器学习笔记-21(Transfer Learning part 1 ; 迁移学习 part 1)
- _spellmod_leech_aura
- 《强化学习与最优控制》学习笔记(一):确定性动态规划和随机性动态规划
- 【故障诊断分析】基于matlab小波变换外圈轴承故障诊断【含Matlab源码 1678期】
- 设置JSP页脚版权标识
- vscode vuejs项目import报错找不到模块“@/assets/image/BackGroun.png”或其相应的类型声明。
- Bootstrap 组件:面板组件(panel)
- vue缓存服务器文件到本地,vue中,在本地缓存中读写数据的方法
- 致远SPM解决方案之安全管理
- [学位论文写作] 将一级标题数字1改为“第一章”
热门文章
- 在线计算机多功能,一种多功能组合计算机制造技术
- 3DSlicer25:Report an Error
- 深入理解文档/视图框架体系_九宫格项目开发感悟
- Delphi中拖动无边框窗口的5种方法
- 关于动态生成输入界面的一些想法及实践
- 多次Jquery引发head.insertBefore( script, head.firstChild );
- BugkuCTF-Misc:闪的好快
- Ribbon、Feign、OpenFeign、spring-cloud-openfeign的区别
- docker部署下的nginx负载均衡时,无法获取真实ip的问题
- hdu1556(树状数组小地方的解释~~~)