C通过JNI反向调用JAVA程序方法
JNI反向调用JAVA程序
引述:上文讲过java线程---OS线程的关系,然后C怎样反向调用JAVA程序方法是我们这篇讲的重点
1.ThreadTest中添加run()方法

2.编译ThreadTest.java javac ThreadTest.java 生成ThreadTest.class
3.javah ThreadTest 生成 ThreadTest.h文件
4.编写ThreadNew.c文件
#include<pthread.h>
#include<stdio.h>
#include "ThreadTest.h"
pthread_t pid;
//void* thread_entity(void* arg){
// run();
//} JNIEXPORT void JNICALL Java_ThreadTest_start0(JNIEnv *env, jobject obj){
jint ret = ;
//获取java类
printf("init\n");
jclass cls = (*env)->FindClass(env,"ThreadTest");
if(cls==NULL){
printf("find Class error!\n");
return;
}
//获取java类构造方法
jmethodID cid =(*env)->GetMethodID(env,cls,"<init>","()V");
if(cid==NULL){
printf("find constructor error!\n");
return;
}
//创建对象
jobject job = (*env)->NewObject(env,cls,cid,NULL);
if(job==NULL){
printf("new instance error!\n");
return;
}
//获取java的run方法
jmethodID tid =(*env)->GetMethodID(env,cls,"run","()V");
if(tid==NULL){
printf("find constructor error!\n");
return;
}
//回调方法
ret = (*env)->CallIntMethod(env,job,tid,NULL);
printf("finish JNICall!\n");
} int main(){
return ;
}

5.链接动态库文件 gcc -fPIC -I /usr/java/jdk1.7.0_79/include -I /usr/java/jdk1.7.0_79/include/linux -shared -o libTestThreadNative.so threadNew.c
6.执行java ThreadTest查看结果

补充说明:这里主要描述了JNI反向调用的大致流程,还有静态方法或者存在返回值方法的调用入参略有区别,参照其他博客说明可进行修改。
C通过JNI反向调用JAVA程序方法的更多相关文章
- Oracle触发器反向调用Java程序
		
导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 1.操作系统需要拥有支持loadjava命令的jdk. 2.加载j ...
 - jni中调用java方法获取当前apk的签名文件md5值
		
相应的java方法: void getsign(Context context) throws Exception { PackageInfo localPackageInfo = context.g ...
 - C#调用java程序
		
前言: 最近跟项目组的人合作一个项目,由于之前我用的是java写的一个与android通信的程序,现在另一个同事来编写界面程序,由于C#编写起来比较方便,而我又不想重新写之前java的那段代码,于是需 ...
 - LoadRunner调用Java程序—性能测试-转载
		
LoadRunner调用Java程序—性能测试 为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunn ...
 - PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。
		
PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...
 - 在ORACLE触发器里调用JAVA程序
		
因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 publ ...
 - 在ASP.Net环境中,当用户点击报表中的超链接时如何调用Java Script方法?
		
问题描述:在ASP.Net环境中,当用户点击报表中的超链接时如何调用Java Script方法? 问题解答: 你可以在TextObject.Hyperlink对象中编写js代码(javascript: ...
 - 在linux下sh批处理文件调用java的方法
		
解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE4663895 ...
 - Android-WebView与本地HTML (HTML调用-->Java的方法)
		
上一篇博客 Android-WebView加载网络图片&网页 介绍了 使用WebView去加载网络上的图片与网页; 此篇博客专门介绍 Android-WebView与本地HTML (HTML调 ...
 
随机推荐
- 用css做三角形
			
<html> <body> <style> .trlangle{ width: 0; height: 0; border-left: 50px solid tran ...
 - 关于如何清除某个特定网站的缓存---基于Chrome浏览器
			
1.清除浏览器缓存 直接在浏览器设置里面清除浏览器的缓存会清除所有网站的缓存信息,这在某些时候是非常不方便的,毕竟不只有测试网站,还会有一些我们不想清除的信息也会被清除掉: 2.通过F12功能去清除浏 ...
 - socket 与 websocket的区别
			
区别: socket并不是一个协议,而是抽象出来的一层,应用于应用层和传输控制层之间的一组接口, socket是传输控制层协议,websocket是应用层协议 websocket是什么样的协议,具有什 ...
 - nm U -l库的
			
nm U -l库的
 - C++中的异常处理(上)
			
C++内置了异常处理的语法元素try... catch ...-try语句处理正常代码逻辑-catch语句处理异常情况-try语句中的异常由对应的catch语句处理 try { ,); } catch ...
 - 爬虫之爬取豆瓣图书名字及ID
			
from urllib import request from bs4 import BeautifulSoup as bs #爬取豆瓣最受关注图书榜 resp = request.urlopen(' ...
 - 2019面向对象程序设计(java)课程学习进度条
			
2019面向对象程序设计(java)课程学习进度条 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 20/10 1/0 5 九九 ...
 - 【西北师大-2108Java】第三次作业成绩汇总
			
[西北师大-2108Java]第三次作业成绩汇总 熟悉PTA平台线上测试环境: 理解用户自定义类的定义: 掌握对象的声明: 学会使用构造函数初始化对象: 使用类属性与方法的使用掌握使用: 掌握pack ...
 - Pwn-level2
			
题目地址 https://dn.jarvisoj.com/challengefiles/level2.54931449c557d0551c4fc2a10f4778a1 先看一下文件的属性 32位 ...
 - 攻防世界web之ics-05
			
本文借鉴以下两篇文章的指导 https://www.jianshu.com/p/5a502873635b https://blog.csdn.net/about23/article/details/9 ...