2010-01-21 7 views
5

Właśnie rozpoczął pracę z systemem Android NDK ale wciąż otrzymuję SIGSEGV kiedy mam tę rozmowę w moim kodu C:Co może spowodować SIGSEGV podczas wywoływania NewObjectArray dla JNI w systemie Android?

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

bazowej na całej przykład mogę znaleźć, powyższy kod jest poprawny, ale wciąż otrzymuję SIGSERGV i wszystko jest w porządku, jeśli linia NewObjectArray zostanie skomentowana. Jakiś pomysł, który może spowodować taki problem?

+0

Zapomniałem wspomnieć, używam NDK1.6 – Ken

Odpowiedz

4

który wygląda dobrze, więc zgaduję, że zrobiłeś coś złego. Zakładam, że używasz checkjni? możesz podzielić to na kilka linii: wykonaj FindClass i sprawdź wartość zwracaną, wykonaj polecenie NewStringUTF i sprawdź wartość zwracaną, a następnie wywołaj NewObjectArray.

btw, możesz chcieć przekazać NULL jako ostatni argument; ten wzorzec użycia pustego łańcucha jako wartości domyślnej dla każdego elementu tablicy jest powszechnie używany (myślę, że jest to kopia & wklejona z jakiejś dokumentacji Sun i rozprzestrzeniła się od niej), ale rzadko jest przydatna i jest nieco nieekonomiczna. (i nie pasuje do zachowania "nowego ciągu [10]" w Javie.)

2

Sądzę, że jedną z możliwych przyczyn jest to, że w metodzie JNI o ​​długim okresie, maszyna wirtualna przestaje działać, gdy kończy się wywoływanie lokalnych wywołań metod (zwykle 512 gniazd w systemie Android).

Ponieważ funkcje FindClass() i NewStringUTF() przydzieliłyby odniesienia lokalne, jeśli pozostaniesz w metodzie JNI przez dłuższy czas, maszyna wirtualna nie wie, czy określone lokalne odniesienie powinno zostać poddane recyklingowi, czy też nie. Powinieneś więc jawnie wywołać DeleteLocalRef(), aby zwolnić pozyskane referencje lokalne, gdy nie są już wymagane. Jeśli tego nie zrobisz, lokalne odnośniki "zombie" zajmą miejsca w VM, a maszyna wirtualna zostanie przerwana, gdy skończy się wszystkie lokalne gniazda referencyjne.

W przypadku krótkookresowej metody JNI może to nie stanowić problemu, ponieważ wszystkie lokalne odwołania zostaną poddane recyklingowi przy wychodzeniu z metody JNI.

Powiązane problemy