从三星Galaxy S2上的android ndk函数返回时崩溃

时间:2011-12-05 09:20:09

标签: java android android-ndk

从三星Galaxy S2上的android ndk功能返回时崩溃。 在我的java代码中,我调用NDK函数,有时(这可能是20个随机情况之一)应用程序在从NDK返回后立即挂起(ANR)。日志说

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)
    {
    }

2 个答案:

答案 0 :(得分:1)

也许,在你的单独线程中,你仍然使用与第一个线程相同的JNIEnv值?你必须调用g_JavaVM->AttachCurrentThread(&env, NULL);或类似的东西来为你的其他线程获得正确的JNIEnv。然后,您应该使用新的JNIEnv值

来重新引用所有类/方法

答案 1 :(得分:0)

可能是由于并发访问。

HTC Desire HD和HTC Legend是单核处理器,因此您可以确保两个线程无法同时访问您的数据。

S2有2个皮质-A9单位。如果你启动了多个可以调用相同NDK函数的线程,那么如果2个进程在同一个数据上工作,那么最好看看发生了什么。