2015-11-17 5 views
5

Esiste una funzione C++, chiamata dal codice Java tramite JNI.
voglio passare correttamente il sottostante c-string a Java, quindi mi hanno fatto seguito accordi:Come passare una stringa C++ a JNI Java in un modo sicuro per thread sicuro?

// main.cpp 
string global; 

const char* data() // Called externally by JNI 
{ 
    return (global = func_returning_string()).data(); // `.data()` = `.c_str()` 
} 

Ma in questo caso, la funzione data() non è più thread-safe.
Qual è il modo migliore per ottenere la sicurezza del thread durante il passaggio della stringa senza causare alcun comportamento indefinito?

risposta

3

voglio passare il sottostante c-string al Java correttamente

Come stai passando stringa di C++ a Java? Non puoi passare C++ nuda puntatore a Java, è necessario utilizzare le funzioni JNI per questo, vale a dire .:

jstring jstr = (*env)->NewStringUTF(env, data()); 

e poi passare jstr a java, o si passa sotto forma di un array Java. Questa funzione duplica la stringa quindi non c'è alcun problema con la sicurezza del thread.

Se si desidera condividere la regione di memoria tra java nad C++, è possibile provare con le seguenti funzioni jni: NewDirectByteBuffer, GetDirectBufferAddress, GetDirectBufferCapacity.

+0

Attualmente non sto usando 'jstring' ecc nel mio codice per tenerlo indipendente da Java (poiché è anche usato per iPhone). Anche se posso aggiungerlo per segregazione. C'è un altro modo, oltre a questo? – iammilind

+0

Io lavoro con codice C++ sotto Android, abbiamo uno strato di codice che unisce codice java con motore C++ - e questo sta usando jni. altro modo - per ottenere dati da C++? - potresti anche passare l'array Java al codice C++ e far sì che il codice C++ lo riempia di contenuto di stringhe. – marcinj

+0

@iammilind 'NewStringUTF' assume che' data() 'restituisca un puntatore a una stringa _modified UTF-8_ terminata da 0x00. In caso contrario, è possibile determinare che tutte le stringhe possibili nei dati siano compatibili. –