java native方法_并发系列-native函数回调Java方法原理实践
生活随笔
收集整理的這篇文章主要介紹了
java native方法_并发系列-native函数回调Java方法原理实践
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫在前面
上一篇分享了Java調用native函數過程原理實踐,文章最后留了一個問題,本章主要對C程序回調我們的Java程序原理進行實踐。
調用C程序之后他是怎么知道來調用我們我們的哪個方法?又是如何進行調用的呢?帶著這兩個疑問往下看。
run方法是怎么執行的?這里分六個步驟來進行驗證:
1、修改代碼,讓c程序來調用這里的run方法
package org.xinhua.cbcloud.util;public class ThreadTest { static { // 裝載庫,保證JVM在啟動的時候就會裝載,故而一般是也給static System.loadLibrary( "ThreadTestNative" ); } public static void main(String[] args) { ThreadTest threadTest =new ThreadTest(); threadTest.start0(); } public void run(){ System.out.println("I am java Thread !!"); } private native void start0();}2、javac編譯java文件生成.class文件
3、javah生成頭文件
4、編寫thread3.c 文件
#include#include#include "org_xinhua_cbcloud_util_ThreadTest.h"pthread_t pid;JNIEXPORT void JNICALL Java_org_xinhua_cbcloud_util_ThreadTest_start0(JNIEnv *env, jobject obj){jint ret = 0;//獲取java類 printf("init");jclass cls = (*env)->FindClass(env,"org/xinhua/cbcloud/util/ThreadTest");if(cls==NULL){printf("find Class error!");return;}//獲取java類構造方法jmethodID cid =(*env)->GetMethodID(env,cls,"","()V");if(cid==NULL){printf("find constructor error!");return;}//創建對象jobject job = (*env)->NewObject(env,cls,cid,NULL);if(job==NULL){printf("new instance error!");return;}//獲取java的run方法jmethodID tid =(*env)->GetMethodID(env,cls,"run","()V");if(tid==NULL){printf("find constructor error!");return;}//回調方法ret = (*env)->CallIntMethod(env,job,tid,NULL);printf("finish JNICall!");}int main(){return 0;}5、生成動態庫鏈接文件
gcc -fPIC -I /usr/lib/jvm/java-1.8.0-openjdk/include -I /usr/lib/jvm/java-1.8.0-openjdk/include/linux -shared -o libThreadTestNative.so thread3.c6、執行測試
回調成功
寫在最后
本章對一些編譯、生成頭文件的之后的操作沒有操作截圖,在上一篇已經詳細介紹過了,有不明白的可以結合上一篇一起來看,如果還是有不明白的地方可以給我留言。
總結
以上是生活随笔為你收集整理的java native方法_并发系列-native函数回调Java方法原理实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: inputstream转fileinpu
- 下一篇: java美元兑换,(Java实现) 美元