Как передать массив byte из java в c++

260
19 августа 2017, 00:39

В java объявлен метод

public native String stringFromJNI(byte[] b);

А на c++ объявлена функция

Java_theflipsiderebirth_testclintgame_1write_1in_1androidstudio_MainActivity_stringFromJNI(JNIEnv* env, object obj, jbyte b[]){...}

Однако по адресу в переменной b лежит мусор. Почему?

Answer 1

Потому, что объявление функции некорректно. Утилита javah генерирует такое определение

JNIEXPORT jstring JNICALL Java_MainActivity_stringFromJNI
  (JNIEnv *, jobject, jbyteArray);

Обратите внимание, что jbyteArray - это не byte[], это тип ссылки на массив байт.

JNIEXPORT jstring JNICALL Java_MainActivity_stringFromJNI(JNIEnv* env, jobject obj, jbyteArray b) {
    jsize size = env->GetArrayLength(b);
    jbyte* buffer = env->GetByteArrayElements(NULL);
    ...
    env->ReleaseByteArrayElements(b, buffer, JNI_ABORT);
}
READ ALSO
setDataFormat в SXSSF, Apache POI

setDataFormat в SXSSF, Apache POI

Создалxlsx файл, в который записываются данные большого объема с БД с помощью SXSSFWorkbook

390
java.lang.UnsatisfiedLinkError: Can't find dependent libraries - iostream

java.lang.UnsatisfiedLinkError: Can't find dependent libraries - iostream

Продолжая исследовать JNI столкнулся с таким моментом: в файлах в которых я описываю реализацию методов(cpp), при подключении iostream после сборки...

336
Navigation Drawer в нескольких активити

Navigation Drawer в нескольких активити

ЗдравствуйтеЕсть код, он дает возможность открывать левую шторку и добавляет гамбургер

320
WebDav и libreoffice 5.3.4 не приходит PUT запрос от libreoffice

WebDav и libreoffice 5.3.4 не приходит PUT запрос от libreoffice

Есть связка приложение на java,spring, реализовываю функционал позволяющий из приложения по клику на ссылку документа(

236