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调 ...
随机推荐
- Unity API学习笔记(2)-GameObject的3种Message消息方法
官方文档>GameObject 首先建立测试对象: 在Father中添加两个脚本(GameObejctTest和Target),分别用来发送Message和接受Message: 在其它GameO ...
- js文件中模块化导入swiper.js文件方法
es6导入: 在js文件顶端 import Swiper from "../../assets/javascripts/swiper.min"; import '../../ass ...
- xml解析-jaxp添加结点
jaxp添加结点 eg: //在第一个下面添加nv / 1.创建解析器工厂 * 2.根据解析器工厂创建解析器 * 3.解析xml返回document * * 4.得到第一个p1 * -得到所有p1使用 ...
- RiscV汇编介绍(1)-编译过程
从c/c++源文件,到可以执行文件,需要以下几个步骤: 预处理/编译 汇编 链接 下面我们以hello world程序为例,展示整个编译链接过程. 1. 编写hello.c代码 #include &l ...
- 为Dynamics CRM注释的图片附件做个预览功能
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复163或者20151017可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! Dynamics CRM中注释可 ...
- Android 布局测试
wrap_content <Button android:id="@+id/button1" android:layout_width="wrap_content& ...
- Java实现单链表反转操作
单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据.二是指针域,用于存储下一个节点的地址.在Java中定义如下: public class ...
- [视频教程] 如何在Linux深度系统deepin下安装docker
笔记: 安装docker的命令 curl -sSL https://get.docker.com/ | sh service docker start 排查错误的命令 strace 视频地址在此:ht ...
- c# 第32节 类的继承
本节内容: 1:为什么要继承 2:继承特点 3:继承的实现 4:子类传统构造,与base构造 1:为什么要继承 2:继承特点 什么是继承: 继承就是子类包含父类的数据结构和行为方式, 包括字段.属性. ...
- Python实现网络图形化界面多人聊天室 - Windows
Python实现网络图形化界面多人聊天室 - Windows 项目名称:网络多人聊天室图形界面版本 项目思路: server.py 服务端文件,主进程中,创建图形化界面,询问地址(主机名,端口),点击 ...