Java和C+之间共享的int[]+;?
我有一个Android应用程序,有两个线程共享应用程序对象中的int[]。一个线程正在收集/处理来自激光雷达的数据并将其存储在int[]中,而另一个线程读取int[]并更新绘制的图像。int[]中的每个位置表示一个特定的角度,每个int的内容表示该角度的距离度量Java和C+之间共享的int[]+;?,java,android,c++,multithreading,java-native-interface,Java,Android,C++,Multithreading,Java Native Interface,我有一个Android应用程序,有两个线程共享应用程序对象中的int[]。一个线程正在收集/处理来自激光雷达的数据并将其存储在int[]中,而另一个线程读取int[]并更新绘制的图像。int[]中的每个位置表示一个特定的角度,每个int的内容表示该角度的距离度量 收集/处理线程需要用C++重新编写,以利用现有代码并提高速度。我计划使用JNI 可以使用什么机制在本机线程和Java线程之间共享int[]?它不是流、缓冲区或生产者/消费者模型 您可以使用sqlite3。它是Android的原生版本,而
收集/处理线程需要用C++重新编写,以利用现有代码并提高速度。我计划使用JNI
可以使用什么机制在本机线程和Java线程之间共享int[]?它不是流、缓冲区或生产者/消费者模型 您可以使用sqlite3。它是Android的原生版本,而且可读性很强。sqlite.org也提供了一个很好的解决方案 警告:sqlite不提供任何类型的行/列锁定,因此您可能需要考虑将Singleton类作为与sqlite3数据库接口的包装器,它可以处理行/列锁定以避免竞争条件 共享工作队列(带有适当的语言包装器)也可以代替创建整个Singleton类(我认为无论如何都是Singleton类),但您的调用是无效的
另一种选择是在应用程序中实现Firebase。是的,我知道它是基于云的,但它也维护一个本地实例。它还乐观地处理行/列锁定;这意味着最后一次更新就是剩下的 您可以使用sqlite3。它是Android的原生版本,而且可读性很强。sqlite.org也提供了一个很好的解决方案 警告:sqlite不提供任何类型的行/列锁定,因此您可能需要考虑将Singleton类作为与sqlite3数据库接口的包装器,它可以处理行/列锁定以避免竞争条件 共享工作队列(带有适当的语言包装器)也可以代替创建整个Singleton类(我认为无论如何都是Singleton类),但您的调用是无效的
另一种选择是在应用程序中实现Firebase。是的,我知道它是基于云的,但它也维护一个本地实例。它还乐观地处理行/列锁定;这意味着最后一次更新就是剩下的 您可以像或一样使用JNI函数 是JNI获取int数组的示例代码
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;
}
JNIEXPORT jint JNICALL Java\u IntArray\u sumArray
(金塔里地区jobject obj JNIEnv*env){
jint-buf[10];
jint i,和=0;
//这行代码是必需的,因为Java数组不能得到保证
//拥有像C数组一样的连续内存布局。
env->GetIntArrayRegion(arr,0,10,buf);
对于(i=0;i<10;i++){
总和+=buf[i];
}
回报金额;
}
您可以使用JNI函数,如或
是JNI获取int数组的示例代码
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;
}
JNIEXPORT jint JNICALL Java\u IntArray\u sumArray
(金塔里地区jobject obj JNIEnv*env){
jint-buf[10];
jint i,和=0;
//这行代码是必需的,因为Java数组不能得到保证
//拥有像C数组一样的连续内存布局。
env->GetIntArrayRegion(arr,0,10,buf);
对于(i=0;i<10;i++){
总和+=buf[i];
}
回报金额;
}
<代码> > p>可以使用JNIOMCOMMIT存储数组中的更改,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 |
+------------+-----------------------------------------------------------+
请看这里,获取来回传递各种数组的示例
可以使用jnIION 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 |
+------------+-----------------------------------------------------------+
请看这里,获取来回传递各种数组的示例
这个本地线程是C++线程,是吗?有IPC频道吗?Sockets/Files/SharedMemory?IPC和Sockets是基于消息的,我不交换消息。共享内存似乎是一个很好的候选对象,但我的问题是,“它怎么能实现?”这个本地线程是C++线程吗?有IPC频道吗?Sockets/Files/SharedMemory?IPC和Sockets是基于消息的,我不交换消息。共享内存似乎是一个不错的选择,但我的问题是,“如何实现它?”