线程的操作
? ?虛擬機支持運行本地代碼作為多重線程環境的一部分。當開發本地組件式有一些JNI技術的限制需要記住。
? ?局部引用僅僅在這當前本地方法中有效和在執行本地方法的線程的上下文。本地引用在多個線程間不能被共享。僅僅全局引用能夠被多個線程共享。
? ?這個JNIEnv接口指針被傳遞給每個本地方法調用也是有效的,當這個線程和這個方法的調用相關聯。它不能被緩存和由其它的線程使用。
??synchronized(obj) {
? /* Synchronized thread-safe code block. */
? }
? 在本地的代碼中,同樣的水平的synchronization能夠被存檔使用JNI的監視方法。
??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必須匹配,以防造成死鎖。
?本地的線程
? 因為本地的線程不被虛擬機知道,所有他們不能直接和Java的組件相互通信。本地的線程應該先附加到虛擬機上為了和存在的應用程序的部分通信。
? Jni提供了AttachCurrentThread函數,通過JavaVm接口指針,運行本地代碼附加本地線程到虛擬機上。這個JavaVm接口指針應該更早的緩存否則它不能獲得。
??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);
總結
- 上一篇: 局部和全局引用的操作
- 下一篇: 什么事SWIG