我有一个具有两个线程的安卓应用程序,它们共享应用程序对象中的int[]。一个线程正在收集/处理来自激光雷达的数据并将其存储在int[]中,而另一个线程读取int[]并更新绘制的图像。int[]中的每个位置表示一个特定的角度,每个int的内容表示该角度的距离测量。
收集/处理线程需要用C++重写,以利用现有代码并提高速度。我计划使用JNI。
可以使用什么机制在本机线程和Java线程之间共享int[]?它不是流、缓冲区或生产者/消费者模型。
发布于 2017-01-23 08:52:09
您可以使用sqlite3。它是Android原生的,而且library reference的可读性也很好。sqlite.org也提供了一个很好的interface specification for C++。
警告: sqlite不提供任何类型的行/列锁定,因此您可能希望考虑创建一个Singleton类作为与sqlite3数据库接口的包装器,它可以处理行/列锁定以避免争用条件。
共享工作队列(使用适当的语言包装器)也可以代替创建整个Singleton类(我想这无论如何都是一个Singleton类),但是您的调用。
另一种选择是在你的应用程序中实现Firebase。是的,我知道它是基于云的,但它也维护一个本地实例。它还乐观地处理行/列锁定;这意味着剩下的就是最后一次更新。
发布于 2017-01-23 15:06:34
您可以使用像GetIntArrayRegion或Jace这样的JNI函数
Here是JNI获取整型数组的示例代码。
JNIEXPORT jint JNICALL Java_IntArray_sumArray
(JNIEnv *env, jobject obj, jintArray arr) {
jint buf[10];
jint i, sum = 0;
// This line is necessary, since Java arrays are not guaranteed
// to have a continuous memory layout like C arrays.
env->GetIntArrayRegion(arr, 0, 10, buf);
for (i = 0; i < 10; i++) {
sum += buf[i];
}
return sum;
}发布于 2017-01-26 04:23:10
您可以使用JNI_COMMIT将更改存储在传递给C++的数组中,数组的元素将在其中更新
可以使用JNI_COMMIT和JNI_ABORT值作为的最后一个参数
(*env)->ReleaseBooleanArrayElements(env, array, body, mode)
+------------+-----------------------------------------------------------+
| mode | actions |
+------------+-----------------------------------------------------------+
| 0 | copy back the content and free the elems buffer |
| JNI_COMMIT | copy back the content but do not free the elems buffer |
| JNI_ABORT | free the buffer without copying back the possible changes |
+------------+-----------------------------------------------------------+请看这里,获取来回传递各种数组的示例
http://jnicookbook.owsiak.org/recipe-No-013/
https://stackoverflow.com/questions/41795935
复制相似问题