码迷,mamicode.com
首页 > 编程语言 > 详细

C通过JNI反向调用JAVA程序方法

时间:2019-11-08 12:24:41      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:构造方法   usr   print   描述   补充   read   share   nis   linu   

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

C通过JNI反向调用JAVA程序方法

标签:构造方法   usr   print   描述   补充   read   share   nis   linu   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!