JNI: Как передать «unsigned char *» из C ++ в Java - PullRequest
1 голос
/ 17 января 2011

У меня есть «unsigned char *», и я хочу передать его в код Java с использованием JNI. Я попробовал его следующим образом

jstring test1;  
std::string str(reinterpret_cast<const char*>(ucptest));  
test1 = env->NewStringUTF(str.c_str());

, где «ucptest» - «unsigned char *»и имеет значения ASCII в нем.этот код работает, и я могу успешно передать jstring в код Java, но в вызове загрузки я вижу сбой в JVM.

Что может быть причиной сбоя?сбои - это непоследовательность, которая может означать повреждение памяти.

Может кто-нибудь предложить лучший способ передачи 'unsigned char *' в Java?

любая помощь приветствуется.

Спасибо

Ответы [ 4 ]

3 голосов
/ 09 сентября 2011

Я нашел решение и подумал, что поделюсь тем же, чтобы другие могли его использовать.

Сначала я конвертировал char* в C ++ String, а затем передавал его в Java String. Это работало очень хорошо, пока у нас не было "0" в строке, которую я пытался преобразовать. Это вызывало сбой.

Наконец, я использовал байтовый массив для передачи значения на сервер. Это работает отлично.

jbyteArray jbArray = env->NewByteArray((int)call.len);
env->SetByteArrayRegion(jbArray, 0, (int)call.len, (jbyte*)call.data);
0 голосов
/ 07 августа 2014

В вашем случае строка env->NewStringUTF(str.c_str()); должна быть внутри условного блока для проверки getStaticMethodInfo:

код может быть оформлен как:

JniMethodInfo t;

if (JniHelper::getStaticMethodInfo(t,<ANDROID CLASS PATH>,<METHOD NAME>,<PARAM TYPE>)) {

    jstring jstr    =   t.env->NewStringUTF(<CONST CHAR* TYPE DATA>);
    ...........CALL TO JAVA METHOD THROUGH JNI
    t.env->DeleteLocalRef(t.classID);

}
0 голосов
/ 18 января 2011

Используемый вами std::string конструктор ожидает c-строку с нулевым символом в конце.Конструктор будет читать, пока не найдет нулевой символ, это может привести к сбою.Вы должны использовать другой конструктор, если ваша строка не заканчивается nul (std::string(char*,size_t)).

0 голосов
/ 17 января 2011

Я не понимаю, почему вы добавляете на дополнительном этапе приведения, строки java в юникоде, unsigned char * или wchar_t * или std::wstring().c_str() можно использовать более напрямую.

unsigned char * ucptest=L"somestring";
jstring test1;  
std::string str(reinterpret_cast<const char*>(ucptest));  
test1 = env->NewStringUTF(str.c_str());

jstring test2 = env->NewString(ucptest,wcslen(ucptest));
...