C通过JNI反向调用JAVA程序方法
Posted VincentYew
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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反向调用的大致流程,还有静态方法或者存在返回值方法的调用入参略有区别,参照其他博客说明可进行修改。
以上是关于C通过JNI反向调用JAVA程序方法的主要内容,如果未能解决你的问题,请参考以下文章