У меня есть страница с информацией — строка
Когда контент находится в JNI (CPP DLL) Я могу видеть весь контент, однако, когда мы видим ту же строку в Java, последнее слово обрезается / обрезается. Поэтому для отладки я пытаюсь записать содержимое в JNI в текстовый файл журнала.
JNIEXPORT jstring JNICALL Java_com_native_ExeCOM_GetResultDetails
(JNIEnv *env, jclass obj)
{
_bstr_t bstrIntermediate( execution->GetResultDetails());
//WriteContentToLog((LPCTSTR)bstrIntermediate); //Able to write this to log (no loss)
CString strFinal;
strFinal.Format(_T("%s"), (LPCTSTR)bstrIntermediate);
//WriteContentToLog((LPCTSTR)strFinal); //Able to write this to log (no loss)
return env->NewStringUTF(strFinal);
}using namespace std;
#define FILE "C:\\Temp\\debug.txt"ofstream DEBUG_STRM;
void WriteContentToLog(const std::string &msg){
DEBUG_STRM.open (FILE,fstream::app);
DEBUG_STRM <<msg<<"\n"; DEBUG_STRM.close();
}
После возвращения jstring, если мы проанализируем то же самое со стороны Java, последнее слово из содержимого будет обрезано / усечено.
Я хочу видеть, происходит ли какое-либо усечение в последней строке «Env-> NewStringUTF (strFinal)» .
1. Могу ли я записать содержимое, возвращаемое последней строкой, в файл журнала?
2. Почему только последнее слово усекается (как я проверил на размер)?
может кто-нибудь помочь мне
Ваши строковые данные могут показывать недостатки в ваших строковых преобразованиях, которые могут быть значительно упрощены.
Строка Java — это подсчитанная последовательность кодовых единиц символов Unicode в кодировке UTF-16.
BSTR
по сути то же самое. (Обычно это так. В конечном итоге это зависит от кода, создающего BSTR.)
NewStringUTF
принимает 0x00-завершенную последовательность кодовых единиц модифицированный UTF-8 закодированные символы Юникода. Если это не характер передаваемой строки, это неправильная функция для использования.
Я рекомендую вам использовать NewString
, передав ему указатель на BSTR
символы и его длина.
Хорошее введение в работу со строками Абсолютный минимум Каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов — никаких оправданий Джоэл Спольски.
ОБНОВИТЬ:
Ваша функция JNI может быть записана как:
JNIEXPORT jstring JNICALL Java_com_native_ExeCOM_GetResultDetails
(JNIEnv *env, jclass obj)
{
BSTR bstr = execution->GetResultDetails();
jstring str = env->NewString(bstr, SysStringLen(bstr));
SysFreeString(bstr); // assuming GetResultDetails transfers ownership
return str;
}
Чтобы узнать, что на самом деле содержит BSTR, создайте дамп с помощью этой функции. Примечание. Байты печатаются как символы ASCII только для ориентации. Приведенная выше реализация предполагает, что это типичный BSTR, то есть он содержит символы Unicode в кодировке UTF-16.
void DumpBstr( BSTR bstr )
{
unsigned char *buffer = (unsigned char *)bstr;
unsigned int *length = (((unsigned int *)bstr) - 1);
unsigned short *terminator =(unsigned short *)(buffer + *length);
UINT len = SysStringLen(bstr);
UINT byteLen = SysStringByteLen(bstr);
printf("Dumping BSTR at %p\n", bstr);
printf(" %s\n", (char *)bstr);
printf(" SysStringLen %i\n", len); // A BSTR created with SysAllocStringByteLen can have an odd byte length. SysStringLen presumes an even number of bytes.
printf(" SysStringByteLen %i\n", byteLen);
if (bstr==NULL) { printf(" NULL is equivalent to an empty string. [VB can pass a BSTR this way and SysStringLen et al account for this]"); return;}
printf(" Hidden length field %i\n", *length);
{
unsigned int i;
for (i = 0; i < *length; i++)
{
printf(" Byte %02X %c\n", *(buffer + i), *(buffer + i));
}
}
printf(" Hidden terminator field %04X\n", *terminator);
}
Других решений пока нет …