Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和C+之间共享的int[]+;?_Java_Android_C++_Multithreading_Java Native Interface - Fatal编程技术网

Java和C+之间共享的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的原生版本,而

我有一个Android应用程序,有两个线程共享应用程序对象中的int[]。一个线程正在收集/处理来自激光雷达的数据并将其存储在int[]中,而另一个线程读取int[]并更新绘制的图像。int[]中的每个位置表示一个特定的角度,每个int的内容表示该角度的距离度量

收集/处理线程需要用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是基于消息的,我不交换消息。共享内存似乎是一个不错的选择,但我的问题是,“如何实现它?”