c 通过java对象回调java_C通过JNI反向调用JAVA程序方法

JNI反向调用JAVA程序

引述:上文讲过java线程---OS线程的关系,然后C怎样反向调用JAVA程序方法是我们这篇讲的重点

1.ThreadTest中添加run()方法

20191108122441896903.png

2.编译ThreadTest.java         javac ThreadTest.java    生成ThreadTest.class

3.javah ThreadTest    生成 ThreadTest.h文件

4.编写ThreadNew.c文件

#include

#include

#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,"","()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;

}

20191108122442004329.png

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查看结果

20191108122442336373.png

补充说明:这里主要描述了JNI反向调用的大致流程,还有静态方法或者存在返回值方法的调用入参略有区别,参照其他博客说明可进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值