2013-05-29 3 views
0

У меня есть страница информационно Строки Когда содержание находится в JNI (каст дллы) я могу видеть все содержимое, однако, когда мы видим ту же строку в Java , последнее слово обрезается/усекается. Поэтому, чтобы отлаживать, я пытаюсь записать содержимое в JNI в файл txt журнала.последнего слова получения обрежется/усечена в 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

Может быть связано с отсутствием потока "flush()" выходного потока? – smallworld

+0

попробовал флеш(), не очень помог. – user1782807

+0

Просьба привести пример ожидаемых данных и то, что усекается. –

ответ

0

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

Строка Java представляет собой подсчитанную последовательность кодовых единиц кодированных символов Юникода, кодированных UTF-16.

A BSTR по существу то же самое. (Обычно это зависит от кода, создающего BSTR.)

NewStringUTF принимает последовательность кодовых единиц кода modified UTF-8, кодированных в кодировке Unicode. Если это не характер строки, которую вы передаете, это неправильная функция.

Я рекомендую вам использовать NewString, передавая ему указатель на символы BSTR и его длину.

Хорошее введение в дело со струнами - The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets—No Excuses от Joel Spolsky.

UPDATE:

Ваша функция 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

Том, спасибо за ответ. Я попытался использовать «NewString», передавая ему указатель на _bstr_t и длину, но без помощи. Однако я нашел аналогичную проблему в форуме Oracle JNI и нашел вторую полезную резолюцию. Я включаю ссылку ниже, пожалуйста, взгляните на нее и сообщите мне свои мысли: https://forums.oracle.com/forums/thread.jspa?threadID=1547869&tstart=1652 – user1782807

+0

Том, я могу использовать ваша функция jni, и это помогло решить проблему. Тем не менее, у меня есть пара вопросов, 1. Не следует ли нам избегать использования необработанных типов, таких как BSTR? 2. слышал, что SysFreeString имеет некоторые проблемы с jvm-сбоем в Win2008? Я немного опасаюсь здесь. – user1782807

+0

2. Я этого не слышал - есть ли у вас ссылки на сообщения об ошибках? Это может быть просто неправильное использование API с участием BSTR. Если функция, создающая BSTR, ожидает, что вы ее освободите, тогда у вас будет утечка памяти, если вы этого не сделаете. 1. Это зависит от того, с чем вы работаете. Поскольку у вас есть функция, которая возвращает BSTR, вы должны начать с этого. Обтекание его в C++-объекте не дает никакого преимущества в этой простой функции JNI. Функции API Sys * String * API довольно просты. С другой стороны, если бы вам пришлось конкатенировать строки, я бы обернул или конвертировал BSTR, а не писал свои собственные функции BSTR. –

Смежные вопросы