线程的操作
? ?虛擬機(jī)支持運(yùn)行本地代碼作為多重線程環(huán)境的一部分。當(dāng)開(kāi)發(fā)本地組件式有一些JNI技術(shù)的限制需要記住。
? ?局部引用僅僅在這當(dāng)前本地方法中有效和在執(zhí)行本地方法的線程的上下文。本地引用在多個(gè)線程間不能被共享。僅僅全局引用能夠被多個(gè)線程共享。
? ?這個(gè)JNIEnv接口指針被傳遞給每個(gè)本地方法調(diào)用也是有效的,當(dāng)這個(gè)線程和這個(gè)方法的調(diào)用相關(guān)聯(lián)。它不能被緩存和由其它的線程使用。
??synchronized(obj) {
? /* Synchronized thread-safe code block. */
? }
? 在本地的代碼中,同樣的水平的synchronization能夠被存檔使用JNI的監(jiān)視方法。
??if (JNI_OK == (*env)->MonitorEnter(env, obj)) {
? ? ? ? ? ? ? /* Error handling. */
? }
? /* Synchronized thread-safe code block. */
? if (JNI_OK == (*env)->MonitorExit(env, obj)) {
? ? ? ? ? ? /* Error handling. */
? }
? Enter和Exit必須匹配,以防造成死鎖。
?本地的線程
? 因?yàn)楸镜氐木€程不被虛擬機(jī)知道,所有他們不能直接和Java的組件相互通信。本地的線程應(yīng)該先附加到虛擬機(jī)上為了和存在的應(yīng)用程序的部分通信。
? Jni提供了AttachCurrentThread函數(shù),通過(guò)JavaVm接口指針,運(yùn)行本地代碼附加本地線程到虛擬機(jī)上。這個(gè)JavaVm接口指針應(yīng)該更早的緩存否則它不能獲得。
??JavaVM* cachedJvm;
? ...
? JNIEnv* env;
? ...
? /* Attach the current thread to virtual machine. */
? (*cachedJvm)->AttachCurrentThread(cachedJvm, &env, NULL);
? /* Thread can communicate with the Java application
? ? ? ?using the JNIEnv interface. */
? /* Detach the current thread from virtual machine. */
? (*cachedJvm)->DetachCurrentThread(cachedJvm);
總結(jié)
- 上一篇: 局部和全局引用的操作
- 下一篇: 什么事SWIG