android的jni不同线程同一变量的访问 示例
时间: 2024-09-19 10:13:14 浏览: 51
Android JNI线程的创建 (十二)
JNI (Java Native Interface) 是Android中用于Java和C/C++代码交互的重要工具。当在JNI中涉及跨线程操作时,特别是对同一个变量的访问,由于线程安全问题,需要特别注意同步机制。
例如,假设有一个在Java中声明的全局变量`int myVar`,在JNI中被C/C++代码修改:
```java
public class MyActivity {
// Java side
private native void updateMyVar(int value);
static {
System.loadLibrary("native-lib");
}
}
// C++ native method (in jni.h)
JNIEXPORT void JNICALL Java_com_example_MyActivity_updateMyVar(JNIEnv *env, jobject obj, jint value) {
// Native code here
globalVariable = value; // Assuming 'globalVariable' is the JNI global reference to the 'myVar'
}
```
如果从另一个线程通过JNI调用`updateMyVar`,可能会导致数据竞争。为了避免这种情况,你需要在C++层添加适当的锁,如`std::mutex`:
```cpp
#include <mutex>
std::mutex mutex;
JNIEXPORT void JNICALL Java_com_example_MyActivity_updateMyVar(JNIEnv *env, jobject obj, jint value) {
std::lock_guard<std::mutex> lock(mutex);
globalVariable = value;
}
```
这样,在更新`globalVariable`之前,会自动获取锁并释放,确保了线程安全性。
阅读全文