Próbuję zamienić C++ std :: string na łańcuch znaków i zwrócę go. Byłoby to łatwe z łatwością, ale z tym, że ciąg, który konwertuję, zawiera prawie losowo wstawione puste znaki. To jest problem dla c_str()
, ale nie dla std::string
. NewStringUTF
będzie przechwytywać tylko część pełnego std::string
. Istnieje pewna nadzieja, że std::string
ma funkcję length()
, która pobiera całą długość, ignorując problematyczne znaki char * \0
.C++ std :: string na jstring o ustalonej długości
Istnieje osobna funkcja NewString, która pobiera jchar * i jsize *, więc wygląda obiecująco, ale nie mogę uzyskać std :: string poprawnie skonwertowanego na jchar *. Próbowałem zrobić to tablicy bajtów, ale prawdopodobnie nie robiłem tego dobrze. Miałem dalsze problemy z konwersją int podanej przez length()
do jsize, która była wymagana przez wywołanie NewString.
Zrobiłem kawał pracy z vector<char> byteArray(stdString.begin(), stdString.end())
, ale to nie doprowadziło mnie bardzo daleko, prawdopodobnie dlatego, że zepsuło to, co jest oryginalnym łańcuchem.
Oto podstawowa funkcja rozrusznika mam, który pracował z ciągów bez zerowych znaków:
jstring StringToJString(JNIEnv * env, const std::string & nativeString) {
return env->NewStringUTF(nativeString.c_str());
}
Na marginesie, ta funkcja jest używana wewnątrz pliku otoki JNI dla Zwracanie obiektu std::string
.
Dzięki za pomoc lub źródła informacji!
dlaczego twój ciąg ma znaki kończące wartość zerową w środku? Wygląda na to, że używasz niewłaściwego pojemnika do danych. –
Zasadniczo przekształcamy tablicę podwójnych znaków w ciąg znaków, więc sekcje podwójnych bajtów są takie same, jak pusty znak. Nie mogę po prostu wydrukować dubletów i umieścić go jako ciąg ascii, to jest zbyt powolne, i ma białe spacje i inne nie-konieczne rzeczy. –
Struny, zarówno w C++, jak i Java, są przeznaczone do przechowywania rzeczy istotnych dla języka naturalnego. Jeśli chcesz przenieść duble do bufora jakiegoś rodzaju, powinieneś używać 'wektora' w C++ i 'jbyteArray' po stronie Java. Bez zobowiązań. Używanie 'NewStringUTF' jest szczególnie złe, ponieważ JVM przekształci twój bufor w UTF, myśląc, że przekazujesz mu ciąg znaków. –