2010-01-21 10 views
5

Ho appena iniziato a lavorare con il NDK Android, ma continuo a ricevere SIGSEGV quando ho questa chiamata nel mio codice C:Cosa potrebbe causare SIGSEGV quando si chiama NewObjectArray per JNI in Android?

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

Base su tutti l'esempio che posso trovare, il codice di cui sopra è corretto, ma io continuo a ricevere SIGSERGV e tutto è ok se la riga NewObjectArray è commentata. Qualche idea su cosa potrebbe causare un tale problema?

+0

Ho dimenticato di menzionare, sto usando NDK1.6 – Ken

risposta

4

sembra giusto, quindi immagino che tu abbia fatto qualcos'altro di sbagliato. Suppongo che tu stia correndo con checkjni? potrebbe essere necessario suddividerlo in più righe: eseguire la FindClass e controllare il valore restituito, eseguire NewStringUTF e controllare il valore restituito, quindi chiamare NewObjectArray.

btw, si potrebbe voler passare NULL come argomento finale; questo schema di usare la stringa vuota come il valore predefinito per ogni elemento dell'array è comunemente usato (penso che sia una copia & incollata da qualche documentazione di Sun e si sia diffuso da lì) ma è raramente utile, ed è un po 'dispendioso. (e non corrisponde al comportamento di "nuova stringa [10]" in Java.)

2

Immagino che una delle possibili cause è che in un metodo JNI a lungo termine, la VM si interrompe quando si esaurisce il slot di riferimento locali per invocazione per metodo (normalmente 512 slot in Android).

Poiché le funzioni FindClass() e NewStringUTF() assegnano i riferimenti locali, se si rimane in un metodo JNI per un lungo periodo di tempo, la macchina virtuale non sa se un riferimento locale specifico debba essere riciclato o meno. Quindi dovresti chiamare esplicitamente DeleteLocalRef() per rilasciare i riferimenti locali acquisiti quando non sono più necessari. Se non lo fai, i riferimenti locali "zombie" occuperanno gli slot in VM e la VM si interromperà mentre esaurisce tutti gli slot di riferimento locali.

Nel metodo JNI a breve termine, questo potrebbe non essere un problema poiché tutti i riferimenti locali verrebbero riciclati quando si esce da un metodo JNI.

Problemi correlati