写在前面

上一篇分享了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方法原理实践相关推荐

  1. creator owner是什么用户_并发系列-到底什么重量级锁?

    本章概述 很多人对锁的理解大概都只是一个概念,那到底什么是重量级锁?不了解重量级锁怎么能看懂偏向锁.轻量级锁,1.6之后对重量级锁的优化并不是因为他重,主要还是因为业务场景,重量级锁存在的原因是因为他 ...

  2. java 检视_Java高并发系列——检视阅读(五)

    JUC中工具类CompletableFuture CompletableFuture是java8中新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类,熟悉一下. Co ...

  3. c++怎么将两个类的方法集合成一个类的方法_一文帮你梳理 Java 集合

    集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在 IDE 上龙飞凤舞,但是作为一名合格的优雅的程序猿 ...

  4. Java并发系列(11)——ThreadPoolExecutor实现原理与手写

    接上一篇<Java并发系列(10)--FutureTask 和 CompletionService> 文章目录 9 线程池 9.1 JDK 线程池 9.2 ThreadPoolExecut ...

  5. java实现分而治之_并发编程中一种经典的分而治之的思想!!

    写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...

  6. java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)

    对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一个程序 ...

  7. 我的世界手机版java安装失败_我的世界中国版JAVA路径错误的解决方法分享

    我的世界中国版JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?九游必须 ...

  8. aop 获取注解注释的方法_带有AOP和注释的Java方法记录

    aop 获取注解注释的方法 有时,我想记录(通过slf4j和log4j )方法的每次执行,查看其接收的参数,返回的内容以及每次执行花费的时间. 这是我在AspectJ , jcabi-aspects和 ...

  9. java获取系统时间的几种方法_获取当前时间的几种方法整理(Java)

    在java中有很多方法可以取到系统时间,记一下最简单的那种 //使用Calendar 获取当前日期和时间 Calendar calendar = Calendar.getInstance(); // ...

最新文章

  1. [CLPR] 定位算法探幽 - 边缘和形态学
  2. php采集绕过cloudflare,三行代码带你绕过cloudflare反爬
  3. python为什么import不了_python – 为什么PyImport_Import无法从当前目录加载模块?
  4. 深入理解控制反转(IoC)和依赖注入(DI)
  5. 机器学习代码实战——梯度下降(gradient descent)
  6. Atitit 发帖机系列(8)  词法分析器v5 版本新特性说明)
  7. linux安装文件密码,linux安装包PGP加密验证
  8. python调用打印机驱动下载_不要驱动,简单粗暴的用树莓派驱动USB打印机
  9. python 让电脑发出声音代码_python - 代码完成时发出声音警报
  10. ad网络标号怎么用_altium designer网络标号的作用范围
  11. [机器学习入门] 李宏毅机器学习笔记-21(Transfer Learning part 1 ; 迁移学习 part 1)
  12. _spellmod_leech_aura
  13. 《强化学习与最优控制》学习笔记(一):确定性动态规划和随机性动态规划
  14. 【故障诊断分析】基于matlab小波变换外圈轴承故障诊断【含Matlab源码 1678期】
  15. 设置JSP页脚版权标识
  16. vscode vuejs项目import报错找不到模块“@/assets/image/BackGroun.png”或其相应的类型声明。
  17. Bootstrap 组件:面板组件(panel)
  18. vue缓存服务器文件到本地,vue中,在本地缓存中读写数据的方法
  19. 致远SPM解决方案之安全管理
  20. [学位论文写作] 将一级标题数字1改为“第一章”

热门文章

  1. 在线计算机多功能,一种多功能组合计算机制造技术
  2. 3DSlicer25:Report an Error
  3. 深入理解文档/视图框架体系_九宫格项目开发感悟
  4. Delphi中拖动无边框窗口的5种方法
  5. 关于动态生成输入界面的一些想法及实践
  6. 多次Jquery引发head.insertBefore( script, head.firstChild );
  7. BugkuCTF-Misc:闪的好快
  8. Ribbon、Feign、OpenFeign、spring-cloud-openfeign的区别
  9. docker部署下的nginx负载均衡时,无法获取真实ip的问题
  10. hdu1556(树状数组小地方的解释~~~)