Что может вызвать SIGSEGV при вызове NewObjectArray для JNI в Android? - PullRequest
6 голосов
/ 22 января 2010

Я только начал работать с Android NDK, но продолжаю получать SIGSEGV, когда у меня есть этот вызов в моем коде C:

jobjectArray someStringArray;
someStringArray = (*env)->NewObjectArray(env, 10, 
(*env)->FindClass(env,"java/lang/String"),(*env)->NewStringUTF(env, ""));

Основываясь на всех примерах, которые я могу найти, приведенный выше код верен, но я продолжаю получать SIGSERGV и все в порядке, если строка NewObjectArray закомментирована. Есть идеи, что может вызвать такую ​​проблему?

Ответы [ 2 ]

5 голосов
/ 24 января 2010

это выглядит правильно, так что я предполагаю, что вы сделали что-то еще не так. я полагаю, вы работаете с checkjni? Вы можете разбить это на несколько строк: выполните FindClass и проверьте возвращаемое значение, выполните NewStringUTF и проверьте возвращаемое значение, а затем вызовите NewObjectArray.

Кстати, вы можете передать NULL в качестве последнего аргумента; этот шаблон использования пустой строки в качестве значения по умолчанию для каждого элемента массива обычно используется (я думаю, что он скопирован и вставлен из какой-то документации Sun и распространился оттуда), но это редко полезно и немного расточительно. (и он не соответствует поведению «новой строки [10]» в Java.)

2 голосов
/ 12 августа 2011

Я полагаю, что одной из возможных причин является то, что в долгосрочном методе JNI виртуальная машина прерывается при исчерпании локальных эталонных слотов для вызова метода (обычно 512 слотов в Android).

Поскольку функции FindClass () и NewStringUTF () будут выделять локальные ссылки, если вы долго находитесь в методе JNI, ВМ не знает, следует ли повторно использовать конкретную локальную ссылку или нет. Поэтому вы должны явно вызывать DeleteLocalRef (), чтобы освободить полученные локальные ссылки, когда они больше не нужны. Если вы этого не сделаете, локальные ссылки «зомби» будут занимать слоты в ВМ, и ВМ прерывается, когда заканчиваются все локальные ссылочные слоты.

В краткосрочном методе JNI это может не быть проблемой, поскольку все локальные ссылки будут перезаписаны при выходе из метода JNI.

...