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反向調用的大致流程,還有靜態方法或者存在返回值方法的調用入參略有區別,參照其他博客說明可進行修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM