Сбой при возврате из функции Android ndk на Samsung Galaxy S2

Сбой при возврате из функции 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)
    {
    }

person willir    schedule 05.12.2011    source источник


Ответы (2)


Возможно, в отдельном потоке вы все еще используете то же значение JNIEnv, что и в первом потоке? Вы должны вызвать g_JavaVM->AttachCurrentThread(&env, NULL); или что-то подобное, чтобы получить правильный JNIEnv для другого потока. Таким же образом вы должны переопределить все свои классы / методы, используя это новое значение JNIEnv.

person Alexander Kulyakhtin    schedule 05.12.2011
comment
Может я чего-то не понимаю. Но я не сохраняю env после возврата из функции ndk. И я не создаю новые темы в ndk. И я не делаю параллельных звонков. Только один звонок одновременно. Т.е. Env должен быть новым в каждом звонке. - person willir; 05.12.2011

Это могло произойти из-за одновременного доступа.

HTC Desire HD и HTC Legend являются одноядерными процессорами, поэтому вы можете быть уверены, что два потока не получат доступ к вашим данным одновременно.

S2 имеют 2 блока cortex-A9. Если вы запускаете более 1 потока, которые могут вызывать одну и ту же функцию NDK, было бы неплохо посмотреть, что произойдет, если 2 процесса работают с одними и теми же данными.

person webshaker    schedule 05.12.2011