java — последнее слово, обрезанное / усеченное в jni

У меня есть страница с информацией — строка
Когда контент находится в 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. Почему только последнее слово усекается (как я проверил на размер)?

может кто-нибудь помочь мне

0

Решение

Ваши строковые данные могут показывать недостатки в ваших строковых преобразованиях, которые могут быть значительно упрощены.

Строка 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);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]