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 = 0;
//获取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 0;
}

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反向调用的大致流程,还有静态方法或者存在返回值方法的调用入参略有区别,参照其他博客说明可进行修改。

原文地址:https://www.cnblogs.com/vincentYw/p/11819244.html

时间: 2024-10-13 12:10:14

C通过JNI反向调用JAVA程序方法的相关文章

Oracle触发器反向调用Java程序

导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 1.操作系统需要拥有支持loadjava命令的jdk. 2.加载jlha.jar包,到oracle数据库中. 操作过程:在dos环境下,输入命令: loadjava -r -f -o -user usscares/[email protected] jlha.jar 注意:jar包要在1.4的环境下编译,项目右键 properties java compiler

jni中调用java方法获取当前apk的签名文件md5值

相应的java方法: void getsign(Context context) throws Exception { PackageInfo localPackageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 64); StringBuilder localStringBuilder = new StringBuilder(); Signature[] arrayOfSignature

JTI + JNI,为Java程序提供获取JVM内部信息的通道

首先,JTI是啥? HotSpot JVM是使用C++写的,在操作系统层面来看,java.exe进程与其他进程并无特别之处.任何一个进程都可以加载第三方的DLL,JTI就是java.exe开放出来的向Java.exe进程注入dll的接口.也就是说,开发者根据JTI定义好的规范,用C++写一个dll,这个dll就可以被java.exe进程加载了[启动jvm的时候要加上-agentlib参数]. JTI的详细资料参见以下网址:http://docs.oracle.com/javase/7/docs/

python调用java程序--jpype

官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html 1.安装 首先在官网上下载程序安装包 ubuntu系统可以直接通过 sudo apt-get install python-jpype 命令安装 ,但是因为会附带安装open-jdk pass  ,手动安装jdk,然后再安装jpype 解压目录 切换到setup.py 目录执行 sudo pyth

LoadRunner调用Java程序—性能测试-转载

LoadRunner调用Java程序-性能测试 为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunner如何调用Java测试代码,完成压力测试. 通常我们在执行一些Server的压力测试的时候,总会不经意间想要一个Client完成对Server的调用示例,以至于我们可以通过LoadRunner直接录制,对于测试人员来说确实很方便.不过,开发人 员如果没有那么多时间去为测试人员服务,那可能就比较悲剧了,

在ORACLE触发器里调用JAVA程序

因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 [java] view plain copy public class Main { public static void modify(String statTime) { String datas = "/var/spool/cron/oracle"; File data = new File

定时cronjob调用Java程序

一个部署在linux环境的Java企业应用后台经常会在大半夜运行很多定时的任务,本篇文章总结下如何使用shell脚本调用Java程序,以备忘. 1. setupenv.sh export APP_HOME=`pwd` if [ -z "$JAVA_HOME" ] ; then JAVA=`which java` if [ -z "$JAVA" ] ; then echo "Cannot find JAVA. Please set your PATH.&qu

在linux下sh批处理文件调用java的方法

解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE46638952F577 dec 加密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 123456 enc 本文主要介绍在linux下sh批处理文件调用java的方法. shell编程的代

cocos2d-x中使用JNI的调用JAVA方法

用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化语言(如C\C++)与JAVA语言进行交互.在交互过程成中,JAVA调用的是已编译好的本地化语言的二进制代码(如Windows下的dll.Linux下的so文件).所以在交叉编译时看到Eclipse的控制台输出 [armeabi] SharedLibrary  : libcocos2dcpp.so