Сбой при возврате из функции Android ndk на Samsung Galaxy S2. В моем java-коде я вызываю функцию NDK, а иногда (это может быть один из 20 случайных случаев) приложение зависает (ANR) сразу после возвращения из NDK. В журнале говорится:
12-05 04:19:59.760: D/AndroidRuntime(5607): Shutting down VM 12-05 04:19:59.760: W/dalvikvm(5607): threadid=1: thread exiting with uncaught exception (group=0x40015578) 12-05 04:19:59.775: W/dalvikvm(5607): threadid=14: thread exiting with uncaught exception (group=0x40015578)
Иногда выполняется несколько строк кода Java, прежде чем это произойдет. Я попытался полностью очистить функцию NDK и удалить все параметры из нее безрезультатно. Функция вызывается из отдельного потока java. На других телефонах (HTC Desire HD, HTC Legend и др.) Я не видел эту проблему.
Это мой java-код, который вызывает функцию ndk:
private static native void ndkFunctionN( byte[] filePath1N, byte[] filePath2N, byte[] filePath3N, byte[] tmpDirN, JavaClass callerN, byte[] param5N, byte[] param6N, byte[] param7N); public static void javaFunction( File file1, File file2, File file3, String tmpDir, JavaClass caller, String param5, String param6, String param7) { try { byte[] filePath1N = file1.getPath().getBytes("UTF-8"); byte[] filePath2N = file2.getPath().getBytes("UTF-8"); byte[] filePath3N = file3.getPath().getBytes("UTF-8"); byte[] tmpDirN = tmpDir.getBytes("UTF-8"); byte[] param5N = appClassName.getBytes("UTF-8"); byte[] param6N = param6.getBytes("UTF-8"); byte[] param7N = param7.getBytes("UTF-8"); mergeAndDumpN( filePath1N, filePath2N, filePath3N, tmpDirN, caller, param5N, param6N, param7N); } catch (UnsupportedEncodingException e) { MyLog.e(e); } }
Это код C++:
JNIEXPORT void JNICALL Java_com_package_name_ClassName_ndkFunctionN ( JNIEnv* env, jobject thiz, jbyteArray filePath1N, jbyteArray filePath2N, jbyteArray filePath3N, jbyteArray tmpDirN, jobject callerN, jbyteArray param5N, jbyteArray param6N, jbyteArray param7N) { }
Возможно, в вашем отдельном потоке вы все еще используете одно и то же значение JNIEnv, как вы получили в своем первом потоке? Вы должны называть g_JavaVM->AttachCurrentThread(&env, NULL);
или что-то подобное, чтобы получить правильный JNIEnv для вашего другого потока. Точно так же вам следует пересмотреть все ваши классы/методы, используя это новое значение JNIEnv
Это может быть связано с одновременным доступом.
HTC Desire HD и HTC Legend являются моно процессорами, поэтому вы можете быть уверены, что два потока не получают доступа к вашим данным в одно и то же время.
S2 имеют 2 блока коры головного мозга A9. Если вы запускаете более одного потока, который может вызывать одну и ту же функцию NDK, может быть хорошей идеей увидеть, что происходит, если 2 процесса работают с одними и теми же данными.