2017-05-29 3 views
-1

was ich arbeite, ist das Lesen von Bilddaten von der Kamera mit C++ und verwenden Sie JNI, um Java diese Bilddaten lesen zu lassen, und ich verwende Mac OSX.SharedBuffer zwischen Java und C++ mit JNI

Der Blocker, den ich derzeit habe, habe ich keine Methode gefunden, um einen gemeinsamen Speicher zwischen zwei Sprachen auf Mac OSX zu erstellen.

Ich könnte mir vorstellen, dass ich einige Puffer dazu verwenden werde, könnte jemand einige Hinweise und Kenntnisse zu diesem Problem geben?

Vielen Dank im Voraus!

Antwort

2

können Sie ByteBuffer.allocateDirect verwenden nativen zugänglich Speicher zu erstellen:

public static native void getCameraData(ByteBuffer bb); 

...

ByteBuffer bb = ByteBuffer.allocateDirect(1024); 
getCameraData(bb); 
// use data 

dann auf der C++ Seite, GetDirectBufferAddress verwenden, um den Block des Speichers zuzugreifen:

JNIEXPORT void JNICALL Java_MyClass_getCameraData(JNIEnv *env, jclass, jobject bb) { 
    void* data = env->GetDirectBufferAddress(bb); 
} 
+0

Danke für Ihre Hilfe! Es gibt eine Frage, die ich stellen möchte. Funktioniert der Puffer wie eine First-In-First-Out-Strategie, so dass das verarbeitete Bild gelöscht werden könnte, so dass ein neues Bild in den Puffer gelegt werden könnte? – Hong

+0

@Hong Wenn du über die Endian-Ness sprichst, kannst du das mit ['order'] (https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html # order-java.nio.ByteOrder-). Ansonsten ist es nur ein Speicherblock. Ich würde vorschlagen, dass Sie die Dokumentation lesen, um eine gute Idee zu bekommen. –

+1

@Hong Nein - es ist nur ein Haufen Speicher, den Java verspricht, sich nicht zu bewegen, wenn eine Garbage Collection stattfindet. –