JNI GetShortArrayElements не работает с SIGSEGV SEGV_ACCERR

Я создал буфер в управляемом коде:

var nativeBuffer = ShortArray(bufferSize) 

Это код Котлина, но в соответствии с документацией stdlib этот синтаксис является фактически оболочкой, которая возвращает short [] .

Затем я хотел бы написать в этот буфер из C ++, используя JNI:

 JNIEXPORT void JNICALL Java_package_class_name_readNext (JNIEnv * env, jclass clazz, jshortArray javaArray) { jboolean * isCopy; short * targetArray = env->GetShortArrayElements(javaArray, isCopy); // Do stuff to targetArray } 

Проблема в том, что вызов GetShortArrayElements всегда приводит к сбою со следующим надгробием:

 11-07 21:23:53.610 86-86/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 11-07 21:23:53.610 86-86/? I/DEBUG: Build fingerprint: 'generic/vbox86p/vbox86p:5.1/LMY47D/buildbot06092001:userdebug/test-keys' 11-07 21:23:53.610 86-86/? I/DEBUG: Revision: '0' 11-07 21:23:53.610 86-86/? I/DEBUG: ABI: 'x86' 11-07 21:23:53.610 86-86/? I/DEBUG: pid: 28339, tid: 28477, name: Thread-282 >>> <package-name> <<< 11-07 21:23:53.610 86-86/? I/DEBUG: signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xb3bcfacb 11-07 21:23:53.613 86-86/? I/DEBUG: eax b3bcfacb ebx b3ffcaa4 ecx a2497000 edx b426e480 11-07 21:23:53.613 86-86/? I/DEBUG: esi a2497000 edi b3fff440 11-07 21:23:53.613 86-86/? I/DEBUG: xcs 00000073 xds 0000007b xes 0000007b xfs 000000e7 xss 0000007b 11-07 21:23:53.613 86-86/? I/DEBUG: eip b3dcd69c ebp 9f5a2968 esp 9f5a2880 flags 00210282 11-07 21:23:53.613 86-86/? I/DEBUG: #00 pc 002e069c /system/lib/libart.so (short* art::JNI::GetPrimitiveArray<_jshortArray*, short, art::mirror::PrimitiveArray<short> >(_JNIEnv*, _jshortArray*, unsigned char*)+572) 11-07 21:23:53.613 86-86/? I/DEBUG: #01 pc 0010cdad /system/lib/libart.so (art::CheckJNI::GetShortArrayElements(_JNIEnv*, _jshortArray*, unsigned char*)+125) 

javaArray не является нулевым (обычно адресом типа -1621480864), а nativeBuffer – это статическая переменная, поэтому вряд ли это GC. Поведение происходит на экземплярах Genymotion (x86) и на устройствах ARM, но я тестировал только Android 5.0+. Что еще я мог пропустить?

К сожалению, вы не используете аргумент isCopy правильно. Должен быть:

 jboolean isCopy; jshort* targetArray = env->GetShortArrayElements(javaArray, &isCopy); 

То есть isCopy – это параметр «out» (использовать C # lingo).

Если вам все равно, является ли targetArray псевдонимом javaArray , вы также можете передать nullptr , например:

 jshort* targetArray = env->GetShortArrayElements(javaArray, nullptr); 

Целевой массив должен быть скорее коротким, чем коротким .

Также вам нужно передать isCopy по ссылке, используя & вместо значения.

Подробнее здесь: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp17382

Intereting Posts
Отключить генерацию META-INF / * в проекте kotlin Anko игнорирует layout_margin, определенный в стиле Как издеваться над статическими методами в Котлине? Неподвижная последовательность, функциональная / потоковая идиома Kotlin В Kotlin, как я идиоматически обращаюсь к значениям вложенной карты с нулевым значением или возвращать значение по умолчанию? Ошибка ввода типа. Firebase JobDispatcher TornadoFX Обновление ItemViewModel, если объект Backing, не отображающий свойства JavaFX, изменен Котин Как указать метку возврата при закрытии в лямбда получение переопределения исключение Тип возвращаемого метода не должен включать переменную типа или подстановочный знак в котлин Firebase Firestore как перечислить авторизованные документы? Android. Mockito использует реальные объекты вместо mock Kotlin Деятельность, не включенная в APK Получите дополнительную строку от активности Kotlin Модифицировать тело 2 до настраиваемого класса Представление привязки Kotlin: как отличить переменную вида от локальной переменной?