2017-07-19 2 views
2

Ich brauche Hilfe, weil ich nicht weiß, was zu tun ist. Ich bin ein Neuling in JNI.Java und JNI globale Variablen

Ich entwickle eine Android-Anwendung und es muss ein spezifisches Protokoll (OpenIGTLink) verwenden.

Um dieses Protokoll zu verwenden, verwende ich eine C-Bibliothek. Das Problem ist, dass ich eine globale Variable definieren muss, um die Verbindung zu speichern. Sie können im nächsten Beispiel sehen:

igtl::ClientSocket::Pointer socket; 


Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_connect(
    JNIEnv *env, 
    jobject mjobject, 
    jstring host, 
    jint port) { 
socket = igtl::ClientSocket::New(); 

const char *chost = env->GetStringUTFChars(host, 0); 

int r = socket->ConnectToServer(chost, port); 
if (r != 0) { 

    return (jstring) "Cannot connect to the server."; 
} 

return (jstring) "ok"; 
} 

und in anderen Verfahren iwant zu tun:

Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_send() { 
    igtl::ImageMessage::Pointer imgMsg = igtl::ImageMessage::New(); 
    imgMsg->SetDimensions(size); 
    imgMsg->SetSpacing(spacing); 
    imgMsg->SetScalarType(scalarType); 
    imgMsg->SetDeviceName("ImagerClient"); 
    imgMsg->SetSubVolume(svsize, svoffset); 
    imgMsg->AllocateScalars(); 
    imgMsg->Pack(); 

    socket->Send(imgMsg->GetPackPointer(), imgMsg->GetPackSize()); 
} 

Ich weiß nicht, ob ich eine Java globale Variable deklarieren Objekt zu speichern de-Buchse und Greifen Sie auf JNI zu oder Sie können Socket wie eine globale Variable in der cpp-Datei definieren.

Vielen Dank an alle und Entschuldigung für mein Englisch.

+0

Es gibt nicht so etwas wie eine Java Ziel variabel ist, ist es schwierig zu wissen, was du redest. – EJP

+0

Vielen Dank für Ihre Antwort. Ich versuche mein Projekt zu erklären. Ich möchte mit OpenIGTLink Bilder von movil camera senden. Ich habe den Code in C++, um einige Bilder von der SD-Karte an einen Server zu senden. Jetzt möchte ich die Bilder von der Kamera senden, also habe ich eine SurfaceView, um die Kamerabilder vorherzusehen. Die Prozesse, die ich denke, ist, Form Java, rufen Sie eine JNI-Funktion auf, um die Verbindung zum Server herzustellen, und rufen Sie dann von Java eine andere JNI-Funktion auf, um die Bilder zu senden. Thnak du sehr !! –

Antwort

0

Vielleicht ist es nicht der beste Weg, aber wir tun es so. Wir geben einen Zeiger von JNI nach Java als jlong ​​zurück und übergeben ihn an jeden Aufruf. Es funktioniert wie ein eigener Zeiger auf das Objekt in Methoden. In Ihrem Fall wird es aussehen irgendwie wie diese

jlong Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_connect(
    JNIEnv *env, 
    jobject mjobject, 
    jstring host, 
    jint port) { 
    /*some code*/ 
    return reinterpret_cast<jlong>(socket); 
} 

und dann

Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_send(jlong pointer) { 
    /*some code*/ 
    igtl::ClientSocket::Pointer socket = reinterpret_cast<igtl::ClientSocket::Pointer>(pointer) 
    socket -> Send(imgMsg->GetPackPointer(), imgMsg->GetPackSize()); 
} 
+0

Vielen Dank für Ihre Antwort. Wenn ich versuche, Ihre Lösung zu machen, bekomme ich den nächsten Compiler-Fehler: Fehler: Fehler: keine passende Konvertierung für C-Style-Umwandlung von 'igtl :: ClientSocket :: Pointer' (aka 'SmartPointer ') nach ' jlong ​​'(alias' lang '). Also kann ich deine Lösung nicht verwenden. Hast du sonst noch eine Idee? Vielen Dank!! –

+0

Ich bin kein Profi in C++, aber Sie denken, Sie sollten reinterpret_cast verwenden. Ich werde versuchen, das Beispiel zu ändern. –