2011-12-05 49 views
1

Samsung Galaxy S2上的android ndk函數返回時崩潰。 在我的java代碼中,我調用了NDK函數,有時(這可能是20個隨機情況之一),應用程序在從NDK返回後立即掛起(ANR)。日誌中說Samsung Galaxy S2上的android 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) 
    { 
    } 

回答

1

也許,在你還在使用相同的JNIEnv值作爲單獨的線程你有你的第一個線程?你必須調用g_JavaVM->AttachCurrentThread(&env, NULL);或類似的東西來爲你的其他線程獲取正確的JNIEnv。用同樣的方法,你應該使用新的JNIEnv值來重新提供所有的類/方法

+0

也許我不明白。但是從ndk函數返回後,我不保存env。而且我不會在ndk中創建新線程。我不做並行呼叫。只有一個電話在同一時間。 也就是說Env在每次通話中都必須是新的。 – willir

0

這可能是由於併發訪問。

HTC Desire HD和HTC Legend是單核心處理器,因此您可以確定兩個線程不會在同一時間訪問您的數據。

S2有2個cortex-A9單元。如果您啓動多個可調用相同NDK功能的線程,那麼查看兩個進程在相同數據上的工作情況可能是一個好主意。

相關問題