Для этого у меня есть функция 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));
});
Это работает в первый раз, но если я перезапущу getDataFromCpp функция, у меня есть эта сбойная ошибка:
Неустранимый сигнал 11 (SIGSEGV), код 1 (SEGV_MAPERR), адрес ошибки 0x0 в tid 26510 (mqt_v_js), pid 26432
Я не совсем понимаю, потому что считаю, что очистка правильная ? Кто-нибудь может мне помочь?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ause-crash
Мобильная версия