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