2017-01-22 5 views
1

Ich habe eine Android-App mit zwei Threads, die ein int [] teilen, das im Application-Objekt ist. Ein Thread sammelt/verarbeitet Daten von einem Lidar und speichert sie im int [], während der andere Thread das int [] liest und ein gezeichnetes Bild aktualisiert. Jede Position im int [] repräsentiert einen bestimmten Winkel und der Inhalt jedes int repräsentiert die Distanzmessung für diesen Winkel.int [] zwischen Java und C++ geteilt?

Der Sammel-/Verarbeitungs-Thread muss in C++ neu geschrieben werden, um den vorhandenen Code zu nutzen und die Geschwindigkeit zu verbessern. Ich plane, JNI zu verwenden.

Welcher Mechanismus kann verwendet werden, um das int [] zwischen dem nativen Thread und dem Java-Thread zu teilen? Es ist kein Stream, Puffer oder Producer/Consumer-Modell.

+0

Dieser native Thread ist ein C++ - Thread, oder? Wie wäre es mit IPC-Kanälen? Sockets/Dateien/SharedMemory? –

+0

IPC und Sockets sind nachrichtenbasiert, und ich tausche keine Nachrichten aus. Shared Memory scheint ein guter Kandidat zu sein, aber meine Frage ist: "Wie könnte es implementiert werden?" –

Antwort

0

Sie könnten sqlite3 verwenden. Es ist nativ für Android, und die library reference ist ziemlich lesbar. sqlite.org bietet auch eine gute interface specification for C++.

Wort der Warnung: sqlite bietet KEINE Zeilen-/Spaltensperrung jeglicher Art, so dass Sie wahrscheinlich einen Blick auf eine Singleton-Klasse als Wrapper für die Schnittstelle mit der sqlite3-Datenbank machen wollen, die Zeile/Spaltenverriegelung, um Rennbedingungen zu vermeiden.

Eine Warteschlange für gemeinsam genutzte Worker (mit entsprechenden Sprachwrappern) funktioniert möglicherweise auch anstelle des Erstellens einer ganzen Singleton-Klasse (die sowieso ein Singleton wäre), aber Ihres Aufrufs.

Eine Alternative könnte Firebase in Ihrer App implementieren. Ja, ich weiß, dass es cloudbasiert ist, aber es verwaltet auch eine lokale Instanz. Es behandelt auch Zeilen-/Spaltensperren optimistisch; Das Letzte, was zu aktualisieren ist, was bleibt.

0

können Sie JNI verwenden Funktion wie GetIntArrayRegion oder Jace

Here ist ein Beispielcode für JNI int-Array zu erhalten.

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; 
} 
0

Sie können JNI_COMMIT verwenden, um Änderungen innerhalb Array C weitergegeben speichern ++, wo Elemente der Matrix aktualisiert werden

können Sie verwenden JNI_COMMIT und JNI_ABORT Werte als letzte Argument von

(*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 | 
+------------+-----------------------------------------------------------+ 

Werfen Sie einen Blick hier für Proben von verschiedenen Arrays hin und her passieren

http://jnicookbook.owsiak.org/recipe-No-013/

Verwandte Themen