Вызов CallVoidMethod несколько раз приводит к сбоюAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Вызов CallVoidMethod несколько раз приводит к сбою

Сообщение Anonymous »

Я пытаюсь использовать JSI и JNI в приложении React-Native для отправки ArrayBuffer без кодирования данных.
Для этого у меня есть функция C++ полученияDataFromCpp< /код> :

Код: Выделить всё

extern "C"
JNIEXPORT void JNICALL
Java_com_mymodule_rtnstreamstream_RTNStreamModule_nativeInstall(JNIEnv *env, jobject thiz, jlong jsi) {
jsi::Runtime * runtime = reinterpret_cast(jsi);
jobject rtnstream_kt_module = env->NewGlobalRef(thiz);
rtnstream::install(*runtime, env, rtnstream_kt_module);
}

Код: Выделить всё

jsi::Function getDeviceName = jsi::Function::createFromHostFunction(
jsiRuntime,
jsi::PropNameID::forAscii(jsiRuntime, "receiveDataFromCpp"),
0,
[&env, &rtnstream_kt_module](
jsi::Runtime& runtime,
const jsi::Value& thisValue,
const jsi::Value* arguments,
std::size_t count
) -> jsi::Value {
if (count != 1 || !arguments[0].isObject()) {
throw jsi::JSError(runtime, "Argument has to be an ArrayBuffer");
}

jsi::Object object = arguments[0].asObject(runtime);
jsi::ArrayBuffer arrayBuffer = object.getArrayBuffer(runtime);

size_t bufferSize = arrayBuffer.size(runtime);
uint8_t* bufferData = arrayBuffer.data(runtime);

jbyteArray jbyteArrayData = env->NewByteArray(bufferSize);
env->SetByteArrayRegion(jbyteArrayData, 0, bufferSize, reinterpret_cast(bufferData));

jclass java_class = env->FindClass("com/myModule/RTNStreamModule");

jmethodID receiveDataFromCpp = env->GetMethodID(java_class, "receiveDataFromCpp", "([B)V"); // My kotlin method

env->CallVoidMethod(rtnstream_kt_module, receiveDataFromCpp, jbyteArrayData);

if (jbyteArrayData != nullptr) {
env->DeleteLocalRef(jbyteArrayData); // Clean up
}

return jsi::Value(static_cast(bufferSize));
});
А из JS просто используйте getDataFromCpp(data);
Это работает в первый раз, но если я перезапущу getDataFromCpp функция, у меня есть эта сбойная ошибка:
Неустранимый сигнал 11 (SIGSEGV), код 1 (SEGV_MAPERR), адрес ошибки 0x0 в tid 26510 (mqt_v_js), pid 26432
Я не совсем понимаю, потому что считаю, что очистка правильная ? Кто-нибудь может мне помочь?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ause-crash
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»